El find
El comando se puede usar de manera bastante concisa en casos simples en los que desea realizar operaciones en coincidencias de nombre de archivo comodín (o más complejas). La siguiente técnica se puede memorizar... ¡casi!
Esto funciona dejando que el find
comando ejecuta otro comando en cada nombre de archivo que encuentra. Puede ejecutar este ejemplo en seco usando echo
en lugar de/delante de mv
.
Si quisiéramos mover todos los archivos en el directorio actual cuyo nombre comienza con 'informe', a otro directorio paralelo llamado 'informes':
find . -name "report*.*" -exec mv '{}' ../reports/ \;
La cadena comodín debe estar entre comillas, el {} que marca el nombre del archivo que se 'encontró' debe estar entre comillas y el punto y coma final debe estar escapado, todo debido al tratamiento de esos caracteres por parte de Bash/shell.
Mire la página man para find
para más usos:https://linux.die.net/man/1/find
Hablemos de cómo funcionan los comodines por un minuto.
cp *.txt foo
en realidad no invoca cp
con un argumento *.txt
, si existe algún archivo que coincida con ese globo. En su lugar, ejecuta algo como esto:
cp a.txt b.txt c.txt foo
Del mismo modo, algo como
mv *.txt *.old
... posiblemente no pueda saber qué hacer, porque cuando se invoca, lo que ve es:
mv a.txt b.txt c.txt *.old
o, peor aún, si ya tienes un archivo llamado z.old
, verá:
mv a.txt b.txt c.txt z.old
Por lo tanto, es necesario utilizar diferentes herramientas. Considere:
# 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
Esto utiliza una expansión de parámetros para eliminar el final del nombre anterior antes de agregar el nuevo nombre.