Оптимизировать find -exec {} с несколькими условиями: определенные файлы в каталоге и определенные подкаталоги в этом dir

Вы можете использовать массив, в котором будет выполняться команда 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
1
31.07.2016, 09:42
1 ответ

Вы могли бы сделать:

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 {} +
1
27.01.2020, 23:47

Теги

Похожие вопросы