¿Cómo muevo archivos de muchos directorios secundarios a mi directorio raíz?

0

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

?

Dave
fuente

Respuestas:

0

¿Qué tal solo:

mv ./*/*.pdf .

Hice una prueba en mi computadora (zsh 5.0.7 (x86_64-pc-linux-gnu)) y funcionó perfectamente:

> ls -r *    

sub3:
r.2  r.1

sub2:
s.2  s.1

sub1:
t.2  t.1

> mv ./*/*.pdf .
> ls
r.1  r.2  s.1  s.2  sub1  sub2  sub3  t.1  t.2


> tree                                                            
.
├── r.1
├── r.2
├── s.1
├── s.2
├── sub1
├── sub2
├── sub3
├── t.1
└── t.2
mnmnc
fuente
Esto es lo que tenía la intención de escribir, pero no tenía suficiente sangría, así que *me comieron.
wurtel
0

Podrías usar findpara esto:

find * -name "*.pdf" -maxdepth 1 -type f -exec mv {} ../ \;
  • -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 comando mv <FILENAME> ../
fstanis
fuente
Hola, cuando ingreso su comando, aparece un error "find: * .pdf: No such file or directory", aunque definitivamente hay archivos en esos directorios con extensiones ".pdf".
Dave
Pido disculpas, no lo probé, por lo que no se detectó un error, el patrón debe ser *mientras los archivos .pdf coinciden usando -name- editado ahora.
fstanis
Debe usar .como punto de inicio para en findlugar de *. Si hay muchos archivos en el directorio actual, esto también fallará con la lista de argumentos demasiado larga .
wurtel
¿Cuál es la diferencia entre usar *y .en este caso?
fstanis
0
mv */*.PDF .

Eso se expandirá a una lista de todos los archivos con extensión .PDFen 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:

echo */*.PDF | xargs -i{} mv {} .

xargsestá 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 decimos xargsreemplazar {}con la lista.

wurtel
fuente
Hola, cuando ingreso el comando echo, aparece el error "xargs: opción ilegal - i". Tenga en cuenta que estoy usando bash en Mac 10.9.5 si eso es importante.
Dave
Hasta donde sé, creo 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.
mnmnc
El mv /.PDF .pasado debido a que el formato se comió mis *personajes. Lo editaré ahora. Lo siento por eso.
wurtel