17

Это поведение по умолчанию для ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

Как заставить ls печатать только базовое имя? Подобно:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

Примечание: я предпочитаю глобализацию оболочки, используя find поскольку /net /nas /data /languages /pypm /sites /rex /free содержит огромное количество файлов и каталогов.

8 ответов8

18

В то время как xargs -0 предназначен для использования для ввода, ограниченного \0 (например, find -print0), ls не имеет такой опции для ограничения своего вывода таким способом.

Тем не мение,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

сделал бы трюк для преобразования новых строк в нули по пути. Это тогда позволяет xargs работать с именами, которые имеют пробелы.

РЕДАКТИРОВАТЬ: добавил -n 1 к XARGS

11

Я использую это:

ls | tr '\n' '\n'

Это дает список как:

file1.mp3
file2.mp3
file3.mp3
...
4

решение awk :

ls -1 /path/glob | awk -F'/' '{print $NF}'
4
ls -1 <path> | sed 's#.*/##'
2

И базовое имя GNU, и базовое имя FreeBSD принимают аргумент -a позволяющий передавать в команду несколько путей. Это прекрасно работает с globbing оболочки.

basename -a /path/glob*
2

ls [необязательный путь] | xargs -0 базовое имя

1

Вы сказали, что предпочитаете шутить над find , но знаете ли вы, что они не являются взаимоисключающими? Глобирование происходит по любой команде, которую вы запускаете, а не только по ls . Например:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

Обратите внимание, что в примере find можно использовать -print0, что удобно, если ваши пути содержат пробелы (решения, основанные на tr упомянутые в другом месте, прекрасно работают на обычных пространствах, но не на файлах, содержащих фактические символы новой строки).

Наконец, если у вас есть доступ к GNU find, вы также можете использовать -printf, который полностью исключает вызов basename:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'
-3

перейдите в каталог, где у вас есть все ваши файлы и введите.

find *.pypm

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .