Исключить каталог из команды `ls -R` во FreeBSD

0

Я хочу перечислить все мои файлы в каталоге во FreeBSD 9.2, но я не хочу включать конкретный каталог. Я проверил оба -I а также --ignore параметры для ls, но I игнорирует только режим суперпользователя и --ignore не поддерживается.

У кого-нибудь есть идеи как пользоваться ls или сделать это с помощью другой команды (например, grep )?

Neyman
источник

Ответы:

0

Если вы хотите перечислить все файлы, кроме тех, которые находятся в определенном каталоге, скажем, notHere Вы можете использовать find Команда сделать это как

find . -path ./notHere -prune -o -type f -print

Объяснение:

  • .: каталог для запуска find в
  • -path ./notHere: запустить правило, которое будет соответствовать пути ./notHere
  • -prune: предотвращать find от спуска в каталог с текущим соответствием
  • -o: добавить or указать, что мы хотим, чтобы первое правило не совпадало
  • -type f: сопоставлять только файлы, а не, скажем, каталоги (удалите это, если вы также хотите видеть записи каталога)
  • -print: часто не требуется, так как это действие по умолчанию, но некоторые версии find все еще хочу, чтобы вы прямо сказали, что хотите, чтобы результат был распечатан

Вы упоминаете о желании другого выхода (в частности, ls -ll ), чем просто список имен файлов. find часто имеет встроенную функцию, чтобы помочь с этим, хотя не те конкретные варианты ls, Вы могли бы заменить -print флаг выше с -ls и посмотреть, если этот набор ls Варианты достаточно близки для вас:

find . -path ./notHere -prune -o -type f -ls

или если это не достаточно хорошо, вы могли бы иметь find Запустите команду, которую вы хотите, вместо того, чтобы пытаться обрабатывать вывод отдельно, как:

find . -path ./notHere -prune -o -type f -exec ls -ll {} +
Eric Renouf
источник
Я не упомянул, что мне нужна информация о файле, поэтому ваш ответ - это ответ! Однако, что я должен сделать, чтобы получить информацию о каждом файле, такую ​​как размер и дата? (Мне нужен выход как ls -ll, Я знаю, что могу передать результат поиска в сценарий оболочки, содержащий while, но я думаю, что это будет очень медленно.
Neyman
Много версий find даже есть -ls что вы могли бы использовать вместо -print, На странице руководства Freebsd написано -ls выдаст вывод как ls -dgils который может быть достаточно близко для вас. В противном случае вы можете заменить -print с -exec ls -ll {} + что должно быть быстрее, чем пытаться обработать весь вывод вручную с while петля
Eric Renouf
Это именно то, что я хочу. Однако я пока не могу +1;)
Neyman
1

Я использую этот скрипт, чтобы отфильтровать все папки с именами, начинающимися с '_'. Вероятно, он не будет работать с папками, в которых есть пробелы, но вы можете изменить его.

#!/bin/sh

A=`ls /j/ | xargs | sed 's/_[a-z0-9]*//g' | awk '{$1=$1;print}'`
W=`echo $A | wc -w | tr -d '[[:space:]]'`
echo $W

В общем, интересная часть такова:

ls some_folder | xargs | sed 's/_[a-z0-9]*//g'

Регулярное выражение _[a-z0-9]* содержит шаблон для сопоставления с именем, которое должно быть исключено.

Это если вы хотите список папок без -a вариант (только имена). Если вы хотите использовать -a тогда самое простое:

ls -la | grep -v skip_folder

где skip_folder это имя, которое вы хотите исключить. Используйте кавычки, если папка содержит пробелы, например:

ls -la | grep -v "skip folder"
Amiramix
источник
ls -la | grep -v "skip folder" только пропускает имя каталога, а его содержимое остается. Я даже использовал ls -ll | pcregrep --color -v -M "directoryAddress(\n|.)*nextDirectoryFullAddress", который опускает весь список. Однако я не считаю это хорошим ответом, поскольку структура каталогов может измениться (т. Е. Между ними может быть добавлен другой список), и некоторые данные будут потеряны.
Neyman
Ваш вопрос немного сбивает с толку, вы хотите рекурсивно перечислять каталоги? Если вы хотите перечислить все файлы во всех каталогах, кроме одного, то лучше всего для этого find поскольку вы можете выделять конкретные имена на основе пути, например: find . | grep -v .ssh/id_rsa
Amiramix