Вы можете использовать массив, в котором будет выполняться команда bash.
Наличие таких файлов:
touch file1 file2 file3 some more file here
И наличие файла игнорирования
, подобного этому
cat <<EOF >ignore
file*
here
EOF
Использование
arr=($(cat ignore));declare -p arr
приведет к следующему:
declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")'
Затем вы можете использовать любую технику для манипулирования этими данными.
Лично я предпочитаю что-то вроде этого:
awk 'NR==FNR{a[$1];next}(!($1 in a))' <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n)
#Output
some
more
ignore
Вы могли бы сделать:
find . -type f -name '*.flac' -execdir sh -c '
if [ ! -d mp3 ] && [ ! -d Mp3 ]; then
for file do
ffmpeg -i "$file" -qscale:a 2 -map_metadata 0 -id3v2_version 3 "${file%.*}.mp3"
done
fi' sh {} +
идея состоит в том, что с -execdir cmd {} +
, (с некоторыми версиями GNU find
), find
будет запускать cmd
для всех соответствующий файл в заданном каталоге.
Я говорю в некоторых версиях GNU find , потому что раньше он работал так, но затем был сломан в некоторых версиях find
(где вы получите один cmd
вызов для каждого файла, как если бы вы использовали -execdir cmd {} \;
), и это было снова исправлено в более поздней версии.
Вы можете проверить, есть ли у вас правильная версия с помощью:
find . -execdir echo {} +
Вы должны получить одну строку на каталог с правильной версией или одну строку на файл с менее правильными.
Если у вас правильная версия, и при условии, что у вас нет тысяч файлов flac в каждом каталоге, вы можете выполнить оба действия за один раз:
find . -type f -name '*.flac' -execdir sh -c '
if [ ! -d mp3 ] && [ ! -d Mp3 ]; then
mkdir Mp3 || exit
for file do
ffmpeg -i "$file" -qscale:a 2 -map_metadata 0 -id3v2_version 3 "Mp3/${file%.*}.mp3"
done
fi' sh {} +