Solución:
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 glob. En cambio, ejecuta algo como esto:
cp a.txt b.txt c.txt foo
Del mismo modo, algo como
mv *.txt *.old
… no puede 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 tengo un archivo llamado z.old
, verá:
mv a.txt b.txt c.txt z.old
Por lo tanto, necesita utilizar diferentes herramientas. Considerar:
# 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 usa una expansión de parámetros para eliminar el final del nombre anterior antes de agregar el nuevo nombre.
los 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 ejecute otro comando en cada nombre de archivo que encuentre. Puede ejecutar este ejemplo usando echo
en lugar de / delante de mv
.
Si quisiéramos mover todos los archivos en el directorio actual con el nombre que comienza con ‘informe’, a otro directorio paralelo llamado ‘informes’:
find . -name "report*.*" -exec mv '{}' ../reports/ ;
La cadena de caracteres comodín debe estar entre comillas, la {} marca del nombre de archivo que se ‘encontró’ debe estar entre comillas y el punto y coma final debe escaparse, todo debido al tratamiento Bash / shell de esos caracteres.
Mire la página del manual para find
para más usos: https://linux.die.net/man/1/find