Estoy usando bash en Mac 10.9.5. Tengo archivos PDF en muchos directorios, todos de un nivel desde la raíz ...
Dir_1/abc.PDF
Dir_2/def.PDF
Dir_3/ghi.PDF
Dir_3/jkl.PDF
...
¿Cómo escribo un comando de shell para mover todos estos archivos al directorio "raíz", es decir, hacer que los archivos se alineen junto con los directorios secundarios ...
abc.PDF
def.PDF
ghi.PDF
Dir_1
Dir_2
Dir_3
?
*
me comieron.Podrías usar
find
para esto:-name "*.pdf"
significa el patrón para que coincida-maxdepth 1
significa que solo irá un nivel profundo-type f
significa ignorar todo lo que no sea un archivo (incluye enlaces simbólicos, directorios, etc.)-exec mv {} ../ \;
es el comando a ejecutar para cada archivo encontrado; para ser específico, esto significa que el comandomv <FILENAME> ../
fuente
*
mientras los archivos .pdf coinciden usando-name
- editado ahora..
como punto de inicio para enfind
lugar de*
. Si hay muchos archivos en el directorio actual, esto también fallará con la lista de argumentos demasiado larga .*
y.
en este caso?Eso se expandirá a una lista de todos los archivos con extensión
.PDF
en todos los subdirectorios de un nivel de profundidad, y los moverá al directorio actual.Puede surgir una complicación si hay tantos que obtiene el error
argument list too long
. En ese caso, esto funcionará, suponiendo que no haya caracteres especiales como espacios, punto y coma, comillas, etc. en el directorio o los nombres de archivo:xargs
está hecho para tales situaciones: toma cadenas en su entrada, recopila tantas como se vaya en una sola ejecución y luego ejecuta el comando dado con la lista recopilada. Aquí les decimosxargs
reemplazar{}
con la lista.fuente
mv /.PDF .
que buscará en el directorio raíz el/
archivo oculto (debido a.
) que se llama.PDF
. Pero, tal vez estoy equivocado. Nunca he visto tal sintaxis para mv.mv /.PDF .
pasado debido a que el formato se comió mis*
personajes. Lo editaré ahora. Lo siento por eso.