Sem usar basename
:
for file in *.ext; do convert -input "$file" -output "${file/%ext/out}"; done
Consulte o link
Uma tarefa simples: dado um diretório de arquivos e um comando que pega um arquivo como entrada e produz um arquivo como saída, eu quero processar todos os arquivos em um diretório de uma só vez e gerá-los com nomes correspondentes correspondentes (com novos extensões).
Então, se o comando normalmente seria:
convert -input sourceFile.ext -output destFile.out
Eu quero processar uma pasta com
file1.ext, file2.ext, etc.
e produzir nos mesmos diretórios os arquivos
file1.out, file2.out, etc.
Existe alguma maneira de fazer isso no terminal sem escrever um script bash? Eu não estou muito familiarizado com scripts, então qualquer solução simples seria apreciada.
Sem usar basename
:
for file in *.ext; do convert -input "$file" -output "${file/%ext/out}"; done
Consulte o link
Procure no comando find
Certifique-se de cd
no seu diretório de entrada.
cd input_directory
find . -iname "*.ext" -exec convert -input {} -output {}.out \;
Isso resulta em .out
sendo anexado ao nome do seu arquivo de entrada. Obtendo seu arquivo de saída declarado eu ainda não descobri.
É sempre bom experimentar o que o find
faz antes de executar o -exec
que altera as coisas.
cd input_directory
find . -iname "*.ext" -type f -exec ls -l {} \;
fará uma espécie de "corrida a seco".
-exec
qual comando executar {}
de qual arquivo foi encontrado; um de cada vez \;
precisa usar isso para terminar com -exec
Minha experimentação limitada indica que você não precisa citar {}
$ find . -type f -exec ls -bl {} \;
-rw-r--r--. 1 me me 0 Oct 20 19:03 ./a\ b\ c.txt
-rw-r--r--. 1 me me 0 Oct 20 19:03 ./abc.txt
$ ls -bl
total 0
-rw-r--r--. 1 me 0 Oct 20 19:03 a\ b\ c.txt
-rw-r--r--. 1 me 0 Oct 20 19:03 abc.txt
me ~/a $'
Eu tenho um arquivo de texto, help.txt, que contém dicas para todos os meus difíceis comandos do bash. Eu tenho isso ligado a um script simples para imprimir o arquivo .., h
Aqui está uma lista dos meus comandos find:
# searches for all files on the system for the string you fill in between the ""
sudo find / -type f -exec grep -il "" {} \;
# search for all files starting with python.
find / -iname 'python*'
# search for the file type .jpeg and sort the list by date
find ~ -iname "*.jpeg" -type f -exec ls -l {} \; 2>/dev/null | sort -r -k 8,8 -k 6,7M
# so I can remember the or syntax.
find ~ \( -iname "*.jpeg" -o -iname "*.png" \) -type f -exec ls -l {} \;
Tente isso (é tudo uma linha):
find /path/to/folder -maxdepth 1 -iname \*.ext -exec sh -c 'convert -input "{}" -output "/path/to/folder/$(basename "{}" .ext).out"' \;
Aqui está o detalhamento:
find /path/to/folder -maxdepth 1 -iname \*.ext
pesquisa todos os arquivos que terminam com .ext
em /path/to/folder
, mas não nas subpastas. A porção -exec
diz ao comando find o que fazer com cada arquivo que encontrar. Cada ocorrência de {}
é então substituída pelo arquivo. O padrão é
find /path/to/folder -iname \*.ext -exec echo "found this file: {}" \;
Como eu disse, o {}
se expande para o nome do arquivo encontrado. O \;
marca o final do parâmetro -exec
. O sh -c
é usado neste caso porque senão o comando $(basename {} .ext)
seria expandido pelo shell prematuramente. Então, colocamos entre aspas simples para impedir a expansão e passá-lo para outra instância do shell. O {}
será expandido em find
e o restante do comando será passado textualmente para sh
. O comando
$(basename "filename.ext" .ext).out
removerá a extensão de "filename.ext"
e anexará a extensão .out
.
EDITAR :
Acabei de perceber o quão inacessível esse comando deve ser. Aqui está a versão mais básica.
find . -name \*.ext -exec sh -c 'convert -input {} -output $(basename {} .ext).out' \;
Ele quase se ajusta sem rolar dessa vez. :)
Depende do que você quer dizer com "escrever um script bash". O seguinte é um script bash, mas você pode simplesmente digitá-lo no terminal, se quiser; você não precisa colocá-lo em um arquivo:
cd
directory_where_the files_are
for x in *.ext
do
convert -input "$x" -output $(basename "$x" .ext).out
done
Isso funcionará somente nos arquivos *.ext
no diretório em que você cd
.
Se você quiser pesquisar subdiretórios também, find
é a melhor solução; por exemplo.,
use a resposta do nispio , mas deixe de fora o -maxdepth 1
.
Edite: o comentário de Hennes sobre a resposta de nispio se aplica aqui também; você poderia dizer
for x in /path/to/folder/*.ext
do
convert -input "$x" -output $(basename "$x" .ext).out
done
Tags command-line bash batch linux script