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

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

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

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

решение1

Если вы хотите вывести список всех файлов, за исключением тех, которые находятся, скажем, в определенном каталоге, 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 {} +

решение2

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

#!/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"

Связанный контент