comando bash per ogni file in una cartella


31

Ho un set di file su cui vorrei applicare lo stesso comando e l'output dovrebbe contenere lo stesso nome del file elaborato ma con un'estensione diversa.

Attualmente sto rinominando /my/data/Andrew.doc in /my/data/Andrew.txt. Vorrei farlo per tutti i file .doc dalla cartella / my / data / e per preservare il nome.

Ho provato diverse versioni ma suppongo di avere qualcosa di sbagliato nella sintassi dato che sono una novità di Linux.


→ un esempio un po 'più completo e pratico: stackoverflow.com/a/43474757/444255
Frank Nocke,

Risposte:


76

Esistono almeno centomila milioni di modi diversi di affrontarlo, ma ecco i contendenti principali:

The Bash for loop

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

utilizzando find

Il findcomando ha un piccolo execcomando delizioso che è ottimo per eseguire le cose (con alcuni avvertimenti). Trovare è meglio del globbing di base perché puoi davvero filtrare i file che stai selezionando. Fai attenzione alla sintassi dispari.

find . -iname '*.doc' -exec echo "File is {}" \;

Nota che findè ricorsivo, quindi potresti voler usarlo -maxdepth 1per mantenerlo findnella directory di lavoro corrente. -type fpuò essere utilizzato per filtrare i file regolari.

Se stiamo solo rinominando doc in txt ...

Il renamecomando è simile a sed nella ricerca. Ovviamente questo non farà nulla per convertire il formato.

rename 's/doc$/txt/' *.doc

22
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.