
En el paso 1, estoy intentando "buscar" el archivo más antiguo en el árbol de directorios, lo cual resolví siguiendo lo siguienteesta pregunta.
Ahora quiero utilizar xargs
para eliminar interactivamente del más antiguo al más nuevo.
Ya que esto find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -i
no funciona. Lo vi en otra publicación
find . -type f -print0 | xargs -0 ls -rt
pero, xargs
lamentablemente, agregarle no funciona.
pi@raspberrypi:/usr/share/doc/samba$ find . -type f -print0 | xargs -0 ls -rt | xargs -0 -d '\n' rm -i
rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.oc.IBM-DS’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-netscapeds5.x.README’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema.IBMSecureWay’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-FDS.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.at.IBM-DS.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-nds.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/ol-schema-migrate.pl.gz’? rm: remove write-protected regular file ‘./examples/LDAP/get_next_oid’? rm: remove write-protected regular file ‘./README.Debian’? rm: remove write-protected regular file ‘./TODO.Debian’? rm: remove write-protected regular file ‘./NEWS.Debian.gz’? rm: remove write-protected regular file ‘./copyright’? rm: remove write-protected regular file ‘./changelog.Debian.gz’? rm: remove write-protected regular file ‘./examples/LDAP/README’?
Tenga en cuenta que esto no es un problema de permisos. Lo he usado /usr/share/doc/samba
como ejemplo para evitar publicar mis nombres de archivos reales.
Al buscar en la web, no pude encontrar ningún script que fuera recursivo (árbol completo), que manejara caracteres de archivo en blanco y que además fuera interactivo. Entonces hice esto. Esto no manejaría todos los tipos de caracteres especiales. Por lo que cualquier mejora sería aceptada.
#!/bin/bash
find -type f -printf '%T+ %p\n' | sort | head -n 3 > /tmp/1
cut -c32- /tmp/1 | awk '{print "rm -i", "\""$_"\""}'/tmp/2
bash /tmp/2
Respuesta1
Los únicos caracteres problemáticos que veo en su script son "
y la nueva línea. No debería preocuparse demasiado por la nueva línea en el nombre de un archivo.
Es posible que desee utilizar diferentes nombres de archivos temporales, por ejemplo con una $$
en el nombre del archivo.
Entonces, como mejora:
#!/bin/bash
TMP1=/tmp/file1.$$
TMP2=/tmp/file2.$$
find -type f -printf '%T+ %p\n' | sort | head -n 3 > $TMP1
cat $TMP1 | sed 's/"/\\"/g;s/[^ ]* //;s/^/rm -i "/;s/$/\"/' >$TMP2
bash $TMP2
rm -f $TMP1 $TMP2
Esto debería manejar las comillas en su nombre de archivo. (nota: todavía hay algunos problemas con el script. Sin embargo, está bien hacer esto en el entorno de su hogar. Y no se recomienda TMP en mayúsculas, pero lo hago de todos modos).
Nota: xargs -p
no funcionará cuando tenga nombres de archivos con espacios.
Respuesta2
Ya casi estabas allí.
Esto hace lo que quieres y maneja espacios en blanco en los nombres de archivos:
find -type f -printf '%T+ %p\n' | sort | cut -c32- | xargs -p -n1 -d '\n' rm
-p, --interactive
: Pregunta al usuario si desea ejecutar cada línea de comando y leer una línea desde la terminal. Ejecute solo la línea de comando si la respuesta comienza con y o Y.
-n max-args, --max-args=max-args
: Utilice como máximo argumentos max-args por línea de comando.
-d delim
Los elementos de entrada terminan en el carácter especificado.