Не безпечно розбирати 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 заборонено (дякую Stéphane). Якщо ви хочете уникати переліку цих каталогів, вам слід додати опцію -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
абоmy.picture.20160518
або простоmypic
.