Не безпечно розбирати 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.