Как перечислить все файлы PDF в каталоге, отсортированном в обратном алфавитном порядке, с ударом?

Мне назвали каталог all_files. Мой сценарий находится в основном каталоге main_dir (all_files подкаталог main_dir).

all_files содержит файлы PDF и только 1 docx файл. Я хочу произвести все имена файлов файлов PDF в обратном алфавитном порядке. Я попробовал это:

tail -r all_files

Но это включает также, что docx файл, который я хочу исключить и он не делает задания. Кто-либо знает, как сделать это?

0
задан 21 October 2019 в 04:10

1 ответ

ls принимает -r/--reverse инвертировать порядок его вывода. Так как его вывод в алфавитном порядке по умолчанию, инвертирование его должно сделать то, что Вы хотите:

ls -r all_files/*.pdf

Это показывает префикс all_files/ на каждом имени файла. Если Вы не хотите делать это, можно использовать:

(cd all_files && ls -r -- *.pdf)

Круглые скобки заставляют команду быть выполненной в подоболочке так, чтобы эффект изменяющегося каталога к all_files не сохраняется после того, как команда работала (т.е. Вы остаетесь, где Вы были позже). Дополнительное -- аргумент ls указывает на конец опций, который заставляет его работать даже в странном случае где один из .pdf файлы имеют имя, которое запускается с - и это могло таким образом иначе быть интерпретировано как опция к ls вместо как аргумент имени файла.

Если Вы хотите перечислить одно имя файла на строку независимо от действительно ли ls производит к терминалу (и независимо от ширины терминала), можно передать ls -1 опция также:

ls -1r all_files/*.pdf
(cd all_files && ls -1r -- *.pdf)

(Передача -1 и -r опции как два отдельных аргумента также работают, и они могут быть переданы в любом порядке. Таким образом, -1r, -r1, -1 -r, и -r -1 вся работа и имеет тот же эффект.)

Отметьте это -r/--reverse не должен быть перепутан с -R/--recursive, который перечислил бы файлы во всех подкаталогах также, и в их подкаталогах, и т.д. Некоторые программы принимают -r опция означать "рекурсивный", но (по крайней мере, в Ubuntu) ls -r выполняет обратный список, не рекурсивный список. Можно выписать его как ls --reverse если Вы предпочитаете. Например:

ls -1 --reverse all_files/*.pdf

Так как у Вас есть все .pdf файлы кроме одного файла с a .docx расширение, ls -r на каталоге как показано выше должно быть достаточным. Однако в связанной ситуации, где были файлы, названные многими путями, но Вы только хотели опустить названных окончанием в .docx, Вы могли использовать это вместо этого:

ls -r all_files/!(*.docx)
(cd all_files && ls -r -- !(*.docx))

Это использует функцию Bash, названную, "расширил globbing". Это включено по умолчанию в интерактивных оболочках, но не включено по умолчанию в сценариях оболочки. Можно проверить, включают ли с этим shopt extglob, включите ("устанавливает") его с shopt -s extglob, и отключите ("сбрасывает") его с shopt -u extglob. Можно использовать подоболочку для включения его всего для одной команды, как показано для cd выше. С той техникой вышеупомянутые две команды становятся:

(shopt -s extglob; ls -r all_files/!(*.docx))
(shopt -s extglob; cd all_files && ls -r -- !(*.docx))
2
ответ дан 22 December 2019 в 00:16

Другие вопросы по тегам:

Похожие вопросы: