Не безопасно разбирать ls
или передавать по трубам find
[ 1 , 2 ]
Не безопасно анализировать (и передавать) выходные данные ls
или find
, главным образом потому, что в именах файлов можно найти необычные символы, такие как символ новой строки , вкладка ... Здесь будет работать чистый цикл оболочки [ cuonglm ] .
Даже find
команда, не включенная в опцию, -exec
будет работать:
find ./*.png -exec basename {} .png \;
Обновления / Заметки : Вы можете использовать, find .
чтобы искать даже скрытые файлы или find ./*.png
получать только не скрытые. С ним find *.png -exec ...
могут возникнуть проблемы, если в нем присутствовал файл с именем, .png
потому что find получит его в качестве опции. Вы можете добавить, -maxdepth 0
чтобы избежать спуска в каталогах, названных как Dir_01.png
, или find ./*.png -prune -exec ...
когда maxdepth не разрешен (спасибо Стефану). Если вы хотите избежать перечисления этих каталогов, вы должны добавить опцию -type f
(которая также исключает другие типы нестандартных файлов). Посмотрите man
на более полную панораму обо всех доступных опциях, и не забудьте проверить, когда они совместимы с POSIX, для лучшей переносимости.
Еще несколько слов
Например, может случиться так, что при копировании заголовка из документа и вставке в имя файла одна или несколько строк новой строки будут заканчиваться в самом имени файла. Мы можем быть настолько неудачливы, что заголовок может содержать даже ключ, который мы должны использовать непосредственно перед новой строкой:
The new art of working on .png
files and other formats.
Если вы хотите проверить, вы можете создать имена файлов, как это с помощью команд
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
Простое /bin/ls *png
будет выводить ?
вместо непечатных символов
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
Во всех случаях , в которых вы будете трубы на выходе из ls
или find
следующая команда не будет иметь никакого намека , чтобы понять , если нынешняя линия исходит от нового имени файла или если он следует символ новой строки символ в Прецедент имени файла . Противное имя действительно, но до сих пор правовые один.
Цикл оболочки с параметром-расширением оболочки ${parameter%word}
, в обоих вариантах с printf
или echo
будет работать [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Со страницы руководства по расширению параметров оболочки [ 3 ]
$ {параметр% word}
$ {параметр %% word}
... результатом раскрытия является значение параметра с удаленным самым коротким шаблоном соответствия (регистр '%') или самым длинным шаблоном соответствия (регистр '%%').
.
в них. Хотя в соглашении говорится, что имена файлов.png
должны указываться в конце, нет причины, по которой у меня не может быть файла png с именемfoo.zip
ormy.picture.20160518
or justmypic
.