Принятый ответ не соответствует передовым методам - он плохо с ошибками с именами файлов с пробелами или символами новой строки в их именах. Для того, чтобы сделать это правильно, если у вас есть find
с -print0
:
#!/bin/bash
data=()
while IFS= read -r -d '' filename; do
data+=("$filename")
done < <(find ~ -iname '*.png' -print0)
Кстати, вы не действительно нужны массивы для этого на всех - или даже find
:
#!/bin/sh
# This version DOES NOT need bash
# function to run for all PNGs in a single directory
translate_all() {
for i in "${1:-$HOME}"/*.png; do
mogrify -crop 1024x794 "$i"
rm "${i%.png}-1.png"
mv "${i%.png}-0.png" "$i"
done
}
# function to run for all PNGs in a single directory and children thereof
translate_all_recursive() {
dir=${1:-$HOME}; dir=${d%/}
translate_all "$dir"
for d in "$dir"/*/; do
translate_all_recursive "$d"
done
done
# actually invoke the latter
translate_all_recursive
Ссылки:
Не то, что это не безопасно для дорожек/файлов с пробелами в них. Также цитируемый '' 'не распространяется правильно, так что это * не может * работать вообще, как написано здесь. И вам не нужно (или нужно) «экспортировать» здесь. –
Это в основном http://mywiki.wooledge.org/DontReadLinesWithFor с дополнительным уровнем косвенности: он разделяет строки и glob-расширяет имена в строке, возвращаемой 'find', поэтому значения больше не гарантируются что эквивалентно их литералам. Короче говоря, имена файлов, которые он возвращает, могут быть ошибочными. –
... если вы хотите это сделать сами, создайте файл с командой 'touch 'hello * world.png'' в непустой директории и посмотрите, что делает этот код в результате. –