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
.pdf
en nombre de archivo
Por ejemplo, si hay un directorio llamado temp
en 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 .pdf
al final. -type f
selecciona solo archivos, no directorios. -delete
significa 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 -name
incluirá solo .pdf
, mientras -iname
que incluirá ambos .pdf
y.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"-name
significa que desea excluir mediante un parámetro de nombre y, ¿cuál-delete
es 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á.pdf
al final.-delete
significa eliminarlo. ¿Estoy claro ahora?-maxdepth 1
parámetro para empezar. Luego sugiera eliminar el parámetro en caso de que se quiera eliminar de forma recursiva.-iname
lugar de-name
, o los archivos con.PDF
una extensión se deslizarán.Con
bash
el globing de shell extendido, puede eliminar cualquier archivo con extensiones que no sean.pdf
usarComo 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
rm
comando, lo que resulta en un error comoPuede modificar este comportamiento predeterminado utilizando la
nullglob
opció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
mv
comando (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:
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
rm
usarxargs
. Por ejemplo:ls
me muestra todols | grep pdf
me muestra los archivos que quiero conservar. Hmmls | grep -v pdf
muestra 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 rm
envía exactamente esa listarm
para su eliminaciónComo dije, me gusta principalmente por la seguridad que proporciona: no es accidental
rm *
para mí. Otras dos ventajas:ls
ofind
para obtener la lista inicial, como prefiera. Puede usar cualquier otra cosa que desee en el proceso de reducir esa lista: otragrep
, algunaawk
o lo que sea. Si necesita eliminar solo archivos cuyos nombres contienen un color, puede crearlo de la misma manera.find
para buscar yrm
eliminar, en lugar de tener que recordar quefind
acepta una-delete
bandera. Y si hace esto, nuevamente, puede componer soluciones alternativas; tal vez en lugar derm
, podría crear untrash
comando que mueva el archivo a la papelera (permitiendo "eliminar") y canalizarlo a ese en lugar derm
. No necesita tenerfind
soporte 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
pdf
cualquier 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 dels
reemplazar 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 -20
al menos puede ver si se ve más o menos correcto, mientras que si simplementerm my_pattern
no 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
find
oxargs
, 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
file
comando.ahora tu problema:
el trabajo de
for
comando es dar los archivos en el directorio actual en forma de variable$var
.if-then
El comando genera los nombres de los archivos pdf tomando el estado de salida0
delfile -i "$var" | grep -q 'application/pdf\;'
comando from , dará el estado de salida de0
solo si encuentra archivos pdf.fuente
¡Advertencia! Mejor inténtalo primero
fuente
-i
congrep
para la combinación de mayúsculas y minúsculasLeer como, eliminar todos los archivos que no son
a.pdf
ox.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 dea
ox
patrones antes del.pdf
sufijo. 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 utilizarbash
el 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.ls
es 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