
Tengo una gran cantidad de libros electrónicos que están muy desorganizados. Algunos de ellos están solos en sus propios directorios, algunos están corruptos, algunos directorios están vacíos. ¿Cómo recopilo mis libros electrónicos de todos estos directorios diferentes y los coloco todos en una carpeta para poder leerlos y reorganizarlos? Preferiría usar comandos nativos de GNU o un script bash.
Respuesta1
Supongo que al menos los tiene todos en varios subdirectorios bajo una única carpeta principal. Algo como ~/mybooks
. Si es así, puedes hacer esto:
find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
Eso encontrará todos los archivos o directorios cuyo nombre termine en .pdf
o .epub
en el directorio ~/mybooks
y los moverá al directorio ~/newdir
. Si puede tener directorios cuyo nombre termine en .pdf
o .epub
, agregue la -type f
directiva para obtener solo archivos:
find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
Respuesta2
Para mover todos los archivos con ciertas extensiones en un árbol de directorios (es decir, en un directorio y sus subdirectorios de forma recursiva) a un solo directorio, en zsh:
mv -i source/**/*.(pdf|epub) destination/
El destination
directorio ya debe existir. Puede omitir la source/
parte si desea recopilar archivos en el directorio actual y sus subdirectorios. Si desea mover todos los archivos independientemente de su nombre, pero no los directorios:
mv -i source/**/*(.) destination/
En fiesta:
shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/
Estos comandos pueden quejarse de que la línea de comando es demasiado larga si tiene muchos archivos. En este caso, puede llamar find
en lugar de utilizar globbing recursivo.
find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +
Si la estructura de directorios existente contiene cierta información, entonces, en lugar de mover los archivos, puede que le resulte más conveniente crearenlaces durosoenlaces simbólicos.
Para crear enlaces físicos, llame ln
en lugar de mv -i
. Con enlaces duros, cada archivo estará presente en ambos lugares a la vez. Si elimina el archivo original o el nuevo, el otro permanece: las dos ubicaciones del archivo están en pie de igualdad. Puede saber que un archivo tiene enlaces físicos porque el número en la segunda columna en el resultado ls -l
es mayor que 1.
Para crear enlaces simbólicos, primero cambie al directorio de destino y llame a ln -s
usando .
(que representa el directorio actual) como destino. Un enlace simbólico es un archivo que simplemente dice "mira este archivo de allí". Si elimina el enlace simbólico, eso no afecta el archivo original. Si mueve o elimina el archivo original, el enlace simbólico queda colgado (es decir, sigue ahí pero ya no apunta a un archivo).
Para eliminar directorios vacíos bajo un directorio, puede usar
find /some/directory -depth -type d -empty -delete