Tengo que mantener todo el directorio que contiene los archivos en un subdirectorio específico, pero para eliminar el resto, todos los directorios en los que el subdirectorio esté vacío.
Para ser más específicos, aquí está la estructura:
A
|
|--------312311
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------453453
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------566532
| |----Recording
| |----a.txt
| |----b.txt
Los subdirectorios pueden o no contener un archivo. Por lo tanto, necesito eliminar todo el directorio como '312311' y '566532' y solo '453453' debería quedar con todos los datos en él porque tiene un archivo en la carpeta 'Grabación' que es un directorio específico para mí.
Vi muchas publicaciones pero enlaza con muchos nombres de archivos específicos. Cualquier ayuda será muy apreciada, ya que tengo que hacerlo muchas veces en una semana.
command-line
directory
find
Derek James
fuente
fuente
Respuestas:
El siguiente script hará exactamente lo que usted describe:
Busca dentro de cada una de las carpetas una carpeta llamada "Grabación"
En una imagen:
resultará en:
La secuencia de comandos
Usar
delete_empty.py
Ejecútelo con el directorio (completo) (que contiene sus subdirectorios, A en su ejemplo) como argumento mediante el comando:
Eso es.
Explicación
Alimentando el contenido de su carpeta "A" al script,
enumerará sus subdirectorios (y archivos). Entonces:
intentará enumerar el contenido de cada una de las (sub) carpetas, lo que generará un error si el elemento es un archivo:
o si la carpeta "Grabación" no existe en absoluto:
Si la carpeta "Grabación" existe y está vacía, se elimina la carpeta superior:
EDITAR
Además, como se solicitó en los comentarios, una versión que verificará múltiples subdirecciones (nombres).
En caso de que el directorio contenga alguno de los subdirectorios enumerados (no vacíos), el directorio se conserva. De lo contrario, se eliminará.
Usar
delete_empty.py
Ejecútelo con el directorio (completo) (que contiene sus subdirecciones, A en su ejemplo) y los nombres de subdirecciones como argumentos mediante el comando:
Eso es.
La secuencia de comandos
Nota
Primero ejecute en un directorio de prueba para asegurarse de que hace exactamente lo que desea.
fuente
Usando
find
yxargs
:(elimine
echo
una vez que se sienta cómodo de que está identificando los directorios correctos). Laprintf '%h\0
parte imprime el directorio padre (terminado en nulo) desdeman find
:Ej .: dado
entonces
fuente
[\d]*
?Aquí hay una solución bash más simple:
Funciona porque
rmdir
fallará si el directorio no está vacío y&&
evitará querm -r
se ejecute a menos quermdir
tenga éxito. El glob*/
se asegura de que solo esté trabajando en los directorios, por lo que otros archivos no se verán afectados.fuente