Vamos dividir em várias linhas
for x in 'find . -type f -name "qf*" | xargs grep -l "foo" | cut -b3-'
do
y=d'echo $x | cut -b2-'
mv $x /root/spammessages
mv $y /root/spammessages/
done
- Você sempre deve usar
-print0
comfind
e-0
comxargs
quando estiver canalizando nomes de arquivos de um para o outro - Use
$()
em vez de backticks para facilitar a leitura e a capacidade de aninhar e reduzir a necessidade de fugas - Sempre cite nomes de variáveis que armazenam nomes de arquivos
- Chamar um externo (
cut
) muitas vezes em um loop é lento (eliminei como não era necessário de qualquer maneira) - Você tem uma barra terminal em um diretório, mas não o outro (consistência)
- Você está cortando o "qf" quando cria a variável
x
, mas não a coloca de volta quando faz a mudança. - Você está cortando "qf", mas não colocando "f" ao fazer a variável
y
(que está cortando um caractere adicional dex
) - Além disso, você tinha aspas tipográficas (inteligentes ou Unicode ou qualquer nome que você queira chamá-las) em torno de seu filespec em
find
, o que pode ter interferido
Tente isto:
for x in $(find . -type f -name "qf*" -print0 | xargs -0 grep -l "foo" | cut -b3-)
do
mv "qf$x" /root/spammessages/
mv "df$x" /root/spammessages/
done
Coloque de volta em uma linha:
for x in $(find . -type f -name "qf*" -print0 | xargs -0 grep -l "foo" | cut -b3-); do mv "qf$x" /root/spammessages/; mv "df$x" /root/spammessages/; done
Editar:
Aqui está uma versão usando um loop while
, que pode funcionar melhor para um grande número de arquivos:
find . -type f -name "qf*" -print0 | xargs -0 grep -l "foo" | cut -b3- |
while read -r x
do
mv "qf$x" /root/spammessages/
mv "df$x" /root/spammessages/
done
Em um verso:
find . -type f -name "qf*" -print0 | xargs -0 grep -l "foo" | cut -b3- | while read -r x; do mv "qf$x" /root/spammessages/; mv "df$x" /root/spammessages/; done
Uma variação que usa a substituição de processos do Bash:
while read -r x
do
mv "qf$x" /root/spammessages/
mv "df$x" /root/spammessages/
done < <(find . -type f -name "qf*" -print0 | xargs -0 grep -l "foo" | cut -b3-)
E:
while read -r x; do mv "qf$x" /root/spammessages/; mv "df$x" /root/spammessages/; done < <(find . -type f -name "qf*" -print0 | xargs -0 grep -l "foo" | cut -b3-)