Мне назвали каталог all_files
. Мой сценарий находится в основном каталоге main_dir
(all_files подкаталог main_dir
).
all_files
содержит файлы PDF и только 1 docx файл. Я хочу произвести все имена файлов файлов PDF в обратном алфавитном порядке. Я попробовал это:
tail -r all_files
Но это включает также, что docx файл, который я хочу исключить и он не делает задания. Кто-либо знает, как сделать это?
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))