Como remover apenas as extensões de arquivo, mantendo as outras partes como elas são

1

Eu tenho alguns arquivos com diferentes extensões em sub pastas como 'aaa'

/f1/aaa/a.txt
/f1/aaa/a.sql
/f1/f2/aaa/b.txt
/f1/f2/aaa/b.csv

O que eu preciso é extrair todos esses arquivos de / f1 e remover apenas suas extensões:

/f1/aaa/a
/f1/f2/aaa/b
    
por zinking 04.11.2013 / 03:53

1 resposta

1

Se por "extrair e remover suas extensões" você quiser renomear o nome, você conseguirá isso.

find f1 -path "*/aaa/*" -type f -exec bash -c 'mv -i -- "$0" "${0%.*}"' {} \;

Ou simplesmente imprimir os arquivos sem sua extensão:

find f1 -path "*/aaa/*" -type f -exec bash -c 'echo "${0%.*}"' {} \;

Em vez de grep ing sobre a saída de find , você deve usar seus recursos de filtragem internos para localizar os arquivos correspondentes. Caso contrário, você obteria falsos positivos para arquivos, incluindo a string aaa .

As substituições de nome de arquivo devem sempre ser citadas para evitar que padrões de espaço em branco ou de globalização sejam expandidos.

Além disso, find output não deve ser canalizado para while a menos que você delimite nulo a saída. Se você realmente quer "fazer alguma coisa" com todos os arquivos, não é necessário canalizar para while . O mesmo efeito pode ser alcançado com a opção -exec .

Se você precisar de find … | while , isso é mais seguro (não se esqueça de citar o nome do arquivo):

find … -print0 | while IFS= read -r -d '' file; do command "$file"; done
    
por 04.11.2013 / 06:48

Tags