Tengo una carpeta llamada /home/user/temps
que tiene 487 carpetas. En cada carpeta tengo un archivo llamado thumb.png.
Quiero copiar todos los archivos llamados thumb.png a una carpeta separada y cambiarles el nombre en función de la carpeta de la que provienen.
Respuestas:
Aqui tienes:
editar:
La sabiduría canónica, por cierto, es que usar
find
esto es una mala idea: simplemente usar la expansión de shell es mucho más confiable. Además, esto suponebash
, pero supongo que es una suposición segura :)editar 2:
para mayor claridad, lo desglosaré:
Los detalles sobre la
${var/Pattern/Replacement}
construcción se pueden encontrar aquí .las comillas en la
cp
línea son importantes para manejar espacios y líneas nuevas, etc. en los nombres de archivo.fuente
new_file/\/thumb
?${VARIABLE/PATTTERN/REPLACEMENT}
produce el valor deVARIABLE
pero con el patrón reemplazado por el texto de reemplazo. Aquí el patrón es/thumb
( es/
necesario escapar para que no se vea${new_file//PATTERN/REPLACEMENT}
, lo que lo convierte en un reemplazo global en lugar de un reemplazo de primera aparición) y el texto de reemplazo está vacío./home/user/temps
, lo que no está claro en la pregunta. Si no lo son, necesita encontrar o**
.Esto funciona para subdirectorios arbitrariamente profundos:
La parte interesante es la expansión de parámetros
${NAME//\//_}
. Toma el contenido deNAME
, y reemplaza cada ocurrencia de/
con_
.Nota: el resultado depende del directorio de trabajo y del parámetro de ruta para buscar. Ejecuté el comando desde el directorio padre de temps. Reemplazar
cp
conecho
para experimentar.fuente
Código de ayuda breve:
vamos a llamarlo 'deslash.sh' y hacerlo ejecutable. Llámalo con:
Fallará si existe una colisión
Pero eso es inevitable.
fuente
Prueba esto
Editar
He agregado citas en caso de que alguno de sus nombres de directorio tenga caracteres de espacio en blanco incrustados en ellos.
También he cambiado esto para que solo imprima los comandos que se ejecutarán. Examine la salida del script para asegurarse de que todos los archivos / nombres de ruta se vean correctos. Cuando esté seguro de que no hay problemas con los comandos que se ejecutarán, elimine el
echo
.fuente
mv -i ./A A/thumb.png ../tmp/.png
- todos los archivos terminan en ../tmp/.png (../tmp es mi directorio de destino).find -type d
y ver la salida. ¿Obtiene eso todos los directorios que espera? Debería, si no, agregar algún resultado para mostrar el problema. Buena suerte.read dir
realiza la división de palabras y toma de un directorioa\nb
a y b como dos instancias, que ninguna máscara puede resolver.Para copiar necesita el comando cp , y cambiar el nombre de linux es lo mismo que mover el archivo, por lo que debe hacerlo con el comando mv . En Linux, siempre debe especificar la ruta completa, desde el origen, si se encuentra en otra carpeta, y hasta la carpeta de destino, por supuesto. Sería algo así, por copia:
o renombrar o mover
fuente
find