Tente isto:
find folder1 -type f -iname '*.flv' -exec bash -c \
'f=${1#folder1/}; [ -f "folder2/${f%.flv}.mp4" ] ||
scripts/script.sh "${1%.flv}"' none {} \;
Isso funcionará com arquivos cujos nomes contenham espaços em branco ou outros caracteres difíceis.
Como funciona
-
find folder1 -type f -iname '*.flv'
Isto encontra os arquivos flv
-
-exec bash -c '...'
Para cada arquivo flv encontrado, isso diz ao find para executar o bash, que executa o script entre aspas (veja abaixo).
-
f=${1#folder1/}
Isso cria uma variável
f
que tem o nome do arquivo flv sem o diretório principal. -
[ -f "folder2/${f%.flv}.mp4" ]
Isso testa para ver se existe um arquivo mp4 correspondente.
-
||
Isto diz ao bash para executar o comando que segue somente se o comando anterior retornou false (em outras palavras, se nenhum arquivo mp4 foi encontrado).
-
scripts/script.sh "${1%.flv}"'
Isso executa seu script nos arquivos flv que não possuem arquivos mp4. Os arquivos são fornecidos para
script.sh
com a parte.flv
removida. -
none {}
Isso diz ao bash para atribuir a string
none
a$0
(esse alocador de espaço nunca é usado) e atribuir o nome do arquivo encontrado porfind
, denotado{}
, à variável de shell$1
. -
\;
Isso sinaliza o fim do comando
-exec
do find.