Il find
Il comando può essere utilizzato in modo abbastanza conciso in casi semplici in cui si desidera eseguire operazioni su corrispondenze di nomi di file con caratteri jolly (o più complessi). La tecnica qui sotto può essere affidata alla memoria... quasi!
Funziona lasciando che find
comando esegue un altro comando su ogni nome file che trova. Puoi provare questo esempio usando echo
invece di/davanti a mv
.
Se volessimo spostare tutti i file nella directory corrente il cui nome inizia con "report", in un'altra directory parallela chiamata "reports":
find . -name "report*.*" -exec mv '{}' ../reports/ \;
La stringa jolly deve essere tra virgolette, il {} che indica il nome del file che è stato "trovato" deve essere tra virgolette e il punto e virgola finale deve essere preceduto da escape, tutto a causa del trattamento Bash/shell di quei caratteri.
Guarda la pagina man di find
per ulteriori usi:https://linux.die.net/man/1/find
Parliamo per un minuto di come funzionano i caratteri jolly.
cp *.txt foo
in realtà non invoca cp
con un argomento *.txt
, se esistono file corrispondenti a quel glob. Invece, esegue qualcosa del genere:
cp a.txt b.txt c.txt foo
Allo stesso modo, qualcosa come
mv *.txt *.old
...non può assolutamente sapere cosa fare, perché quando viene invocato, ciò che vede è:
mv a.txt b.txt c.txt *.old
o, peggio, se già hai un file chiamato z.old
, vedrà:
mv a.txt b.txt c.txt z.old
Pertanto, è necessario utilizzare diversi strumenti. Considera:
# REPLACES: mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err
for f in /data/*/Sample_*/logs/*_Data_time.err; do
mv "$f" "${f%_Data_time.err}_Data_time_orig.err"
done
# REPLACES: cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*.sh; do
cp "$f" "${f%.sh}_orig.sh"
done
# REPLACES: sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*_orig.sh; do
if [[ -e "$f" ]]; then
# honor the script's shebang and let it choose an interpreter to use
"$f"
else
# script is not executable, assume POSIX sh (not bash, ksh, etc)
sh "$f"
fi
done
Questo utilizza un'espansione dei parametri per rimuovere la parte finale del vecchio nome prima di aggiungere il nuovo nome.