cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- El primer comando lo llevará al directorio en el que desea eliminar sus archivos.
- El segundo comando eliminará todos los archivos excepto aquellos que terminen
.pdfen nombre de archivo
Por ejemplo, si hay un directorio llamado tempen su carpeta de inicio:
cd ~/temp
luego borre los archivos:
find . -type f ! -iname "*.pdf" -delete
Esto eliminará todos los archivos excepto xyz.pdf.
Puede combinar estos dos comandos para:
find ~/temp -type f ! -iname "*.pdf" -delete
.es el directorio actual !significa tomar todos los archivos excepto los que están .pdfal final. -type fselecciona solo archivos, no directorios. -deletesignifica eliminarlo.
NOTA: este comando eliminará todos los archivos (excepto los archivos pdf pero incluidos los archivos ocultos) en el directorio actual, así como en todos los subdirectorios. !debe venir antes -name. simplemente -nameincluirá solo .pdf, mientras -inameque incluirá ambos .pdfy.PDF
Para eliminar solo en el directorio actual y no en los subdirectorios, agregue -maxdepth 1:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
.significa "y"?!significa "excepto"-namesignifica que desea excluir mediante un parámetro de nombre y, ¿cuál-deletees la acción que debe tomar al encontrarlo? Entonces, ¿busca todo excepto "* .pdf" y los elimina? ¿O he entendido mal?.significa directorio actual.!significa tomar todos los archivos excepto el que está.pdfal final.-deletesignifica eliminarlo. ¿Estoy claro ahora?-maxdepth 1parámetro para empezar. Luego sugiera eliminar el parámetro en caso de que se quiera eliminar de forma recursiva.-inamelugar de-name, o los archivos con.PDFuna extensión se deslizarán.Con
bashel globing de shell extendido, puede eliminar cualquier archivo con extensiones que no sean.pdfusarComo señaló @pts, los
--caracteres indican el final de cualquier opción de comando, haga que el comando sea seguro en el raro caso de archivos cuyos nombres comiencen con un-carácter.Si desea eliminar archivos sin ninguna extensión, así como aquellos con extensiones que no sean
.pdf, entonces, como lo señaló @DennisWilliamson, podría usarEl globbing extendido debe estar habilitado de forma predeterminada, pero si no, puede hacerlo utilizando
Especialmente si tiene la intención de usar esto dentro de un script, es importante tener en cuenta que si la expresión no coincide con nada (es decir, si no hay archivos que no sean pdf en el directorio), de forma predeterminada, el globo se pasará sin expandir al
rmcomando, lo que resulta en un error comoPuede modificar este comportamiento predeterminado utilizando la
nullglobopción de shell, sin embargo, eso tiene su propio problema. Para una discusión más completa ver NullGlob - Greg's Wikifuente
rm *~*.pdf!(*.py). Además, presumiblemente, si el OP solo quiere archivos ".pdf" restantes, entonces los archivos sin extensiones también deberían eliminarse y no ignorarse.Eliminar a la papelera :
O a través de un
mvcomando (pero de esta manera no puede restaurarlo desde la Papelera ya que no registra información .trashinfo, por lo que esto significa que movió sus archivos a un destino donde está de la siguiente manera).fuente
rm.El enfoque más fácil: cree otro directorio en algún lugar (si solo está eliminando en un directorio, no de forma recursiva, incluso puede ser un subdirectorio); mueve todos los archivos .pdf allí; eliminar todo lo demás; mueve el pdf hacia atrás; Eliminar el directorio intermedio.
Rápido, fácil, puedes ver exactamente lo que estás haciendo. ¡Solo asegúrese de que el directorio intermedio esté en el mismo dispositivo que el directorio que está limpiando para que los movimientos sean renombrados, no copias!
fuente
Utilice el GLOBIGNORE de bash:
De la página de manual de bash:
GLOBIGNORE: Una lista de patrones separados por dos puntos que definen el conjunto de nombres de archivo a ignorar por la expansión de nombre de ruta.Una prueba rápida:
Salida:
fuente
Tenga cuidado y componga: use xargs
Aquí hay un enfoque que me gusta, porque me permite ser muy cuidadoso: componga una forma de mostrar solo los archivos que quiero eliminar y luego envíelos a
rmusarxargs. Por ejemplo:lsme muestra todols | grep pdfme muestra los archivos que quiero conservar. Hmmls | grep -v pdfmuestra lo contrario: todo excepto lo que quiero conservar. En otras palabras, muestra la lista de cosas que quiero eliminar. Puedo confirmar esto antes de hacer algo peligroso.ls | grep -v pdf | xargs rmenvía exactamente esa listarmpara su eliminaciónComo dije, me gusta principalmente por la seguridad que proporciona: no es accidental
rm *para mí. Otras dos ventajas:lsofindpara obtener la lista inicial, como prefiera. Puede usar cualquier otra cosa que desee en el proceso de reducir esa lista: otragrep, algunaawko lo que sea. Si necesita eliminar solo archivos cuyos nombres contienen un color, puede crearlo de la misma manera.findpara buscar yrmeliminar, en lugar de tener que recordar quefindacepta una-deletebandera. Y si hace esto, nuevamente, puede componer soluciones alternativas; tal vez en lugar derm, podría crear untrashcomando que mueva el archivo a la papelera (permitiendo "eliminar") y canalizarlo a ese en lugar derm. No necesita tenerfindsoporte para esa opción, solo tiene que canalizarla.Actualizar
Vea los comentarios de @pabouk para ver cómo modificar esto para manejar algunos casos extremos, como saltos de línea en nombres de archivos, nombres de archivos como
my_pdfs.zip, etc.fuente
pdfcualquier parte de su nombre. --- b) Eliminará los archivos PDF si alguna de las letras del sufijo es mayúscula. --- c) No es una buena idea utilizar la salida dels. No funcionará con nombres de archivo que contengan nuevas líneas. Algunas implementaciones delsreemplazar caracteres especiales, por ejemplo, tab?. --- Es mejor uso:find -maxdepth 1 -print0. (no tan corto comols:) ----- Para resolver a) yb) usegrep -vi '\.pdf$'--- solución completa (pero solo GNU):find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm| head -20al menos puede ver si se ve más o menos correcto, mientras que si simplementerm my_patternno tiene la oportunidad de detectar un gran error.find . -type f ! -name "*.pdf"para imprimir en la consola, o canalizar a menos o un archivo. [y luego canalice a xargs a rm si lo desea, como los comentarios de pabouk (con el -print0 | ... -0 para nombres de archivo extraños)]Por lo general, resuelvo estos problemas con el intérprete interactivo de Python:
Puede ser más largo que una línea con
findoxargs, pero es extremadamente resistente y sé exactamente lo que hace, sin tener que investigarlo primero.fuente
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]La mejor respuesta (en comparación con mi respuesta anterior) a esta pregunta será utilizando el poderoso
filecomando.ahora tu problema:
el trabajo de
forcomando es dar los archivos en el directorio actual en forma de variable$var.if-thenEl comando genera los nombres de los archivos pdf tomando el estado de salida0delfile -i "$var" | grep -q 'application/pdf\;'comando from , dará el estado de salida de0solo si encuentra archivos pdf.fuente
¡Advertencia! Mejor inténtalo primero
fuente
-icongreppara la combinación de mayúsculas y minúsculasLeer como, eliminar todos los archivos que no son
a.pdfox.pdf.Esto funciona mediante la utilización de globos 2 extendidos, el exterior
!()para negar el pegote contenida que a su vez requiere que el pegote debe coincidir con uno o más deaoxpatrones antes del.pdfsufijo. Ver glob # extglob .fuente
forma de concha portátil
Más o menos POSIX y compatible con cualquier cáscara de estilo Bourne (
ksh,bash,dash). Muy adecuado para scripts portátiles y cuando no se puede utilizarbashel globing de shell extendido.perl:
O un poco más limpio:
pitón alternativa
fuente
¡Ten cuidado con lo que estás borrando!
Una forma segura de probarlo antes de intentar eliminar es probar primero
ls, ya que algunos comportamientos no detectados podrían eliminar archivos no deseados. Y puede hacerlo directamente fuera del directorio.lses similar arm, entonces:Esto listará
Y ahora puede ver lo que está eliminando y puede eliminarlos de forma segura:
Y eso es. Puede usar comodines
*para ser más selectivo, como conservar solo los documentos del curso de programación:fuente