Como zerar arquivos nas pastas que possuem espaço no nome do arquivo

0

Estou tentando zerar (truncar) todos os arquivos em uma pasta ou subárvore que correspondem a um curinga. Outro post recomendou o uso do find … -execmétodo over , que recebeu críticas elevadas. Quando tentei o método, no entanto, não consegui fazê-lo funcionar em arquivos com espaços em seus nomes.for variable in wildcardfind … -exec

Dois métodos tentados:

for método (obras):

for x in *.wav; do echo -n "" > "$x"; done

find método (precisa de ajuda):

find . -type f -iname \*.wav -exec > "{}" \;

que produz

find: invalid argument `;' to `-exec'

e cria um arquivo chamado {}de zero bytes.

Observe que a substituição > "{}"por echo {}imprime a lista de arquivos na pasta, portanto a sintaxe está próxima. Só preciso descobrir como atenuar o erro com nomes de arquivos espaçados.

TheHairyOne
fonte
Como observado no meu comentário abaixo, -exec > {}não funciona, nunca , ponto final. Isso não tem nada a ver com espaços nos nomes de arquivos.
G-Man
Eu tomaria muito cuidado ao testar essas soluções ... Parece incompleto!
Beroe

Respostas:

1

O problema com seu findcomando é que ele espera -execmanipular a >, mas find … -execmanipula apenas comandos simples. Somente o shell sabe como interpretar >. (OK, pode haver um ou dois outros programas que podem fazê-lo, mas findnão é um deles.)

Se você quiser algo próximo do que tem, use

find . -type f -iname "*.wav" -exec sh -c '> "$1"' - {} \;

em que você diz findpara executar um shell, e você usa -cpara dizer ao shell para executar um c ommand que consiste em >seguido pelo nome do arquivo. Eu recomendaria que você fizesse algo mais simples:

find . -type f -iname "*.wav" -exec cp /dev/null {} \;
G-Man
fonte
Obrigado, vou usar o método cp / dev / null, em outro lugar eu vi um comentário de que o método 'find' era superior ao método 'for'. Também vi recentemente alguém mencionar o uso de uma ferramenta truncada, o que também pode ser bom. Presumo que ninguém torne nenhuma dessas ferramentas recursivas, pois são consideradas arriscadas. Embora eu considere rm -rf ser tão arriscado. Obrigado!
TheHairyOne 4/03/15
Estou curioso para saber onde você está lendo este conselho. Como discutido em Looping através de arquivos com espaços nos nomes (em nosso site Unix e Linux), for x in `find . -name "*.wav"`é o tipo de coisa que você realmente precisa evitar. for x in *.wavnão é tão ruim.
G-Man
0

Você não precisa citar a {}construção em find -exec:

find . -type f -name '* *' -exec ls {} \;

Você não pode usar >em find -exec, ele só quer um comando e parâmetros. Crie um script para chamar, find -execse você precisar.

choroba
fonte
-exec> {} funciona bem para arquivos sem espaços, apenas recebe erros em arquivos que contêm espaços. Qual sintaxe do seu exemplo você usaria para zerar os arquivos encontrados? Eu estou supondo -exec rm {}; tocar {} \; é a única opção?
TheHairyOne
@TheHairyOne: Para mim, -exec > {}retorna find: invalid argument `;' to -exec'e cria um arquivo vazio {}. A opção é criar um script truncate.shque faça o que você deseja "$1"e depois chamá-lo -exec.
Choror 4/03/15
@TheHairyOne: Concordo: -exec > {}não funciona, nunca , ponto final. Isso não tem nada a ver com espaços nos nomes de arquivos.
G-Man