Quiero usar el comando find, para encontrar todos los archivos con una cierta extensión (avi), donde el mismo nombre de archivo con otra extensión (mp4) aún no existe.
considerando estos archivos:
a.avi
a.mp4
c.avi
solo debería dar como resultado que se encuentre el archivo c.avi.
Respuestas:
¿Haría esto?
Trataré de explicar cómo funciona.
Bueno, de hecho es muy fácil: encuentra todos los archivos en el directorio actual de modo que el nombre tenga
avi
extensión. Para cada uno de estos, digamos que su archivo seX.avi
ejecuta en el directorio en el que está (execdir
) el comando:donde
{}
se reemplaza por el nombre del archivo, en nuestro caso de pruebaX.avi
. Entonces esto es comoEn este punto, permítanme enfatizar que esto es 100% seguro con respecto a espacios y otros símbolos divertidos en los nombres de archivos ¿Ahora ves el fragmento que bash ejecutará? Me refiero a este fragmento
Se ejecutará con el parámetro posicional 0 a establecido para nuestro nombre de archivo; en nuestro ejemplo de prueba es
X.avi
.La parte se
"${0%avi}"
expande al nombre de archivo, con el seguimientoavi
eliminado (por cierto, se garantiza que este nombre de archivo tenga esta extensión en este punto), y la parte"${0%avi}"*
se expandirá a todos los archivos en el directorio actual (recuerde, el que contiene el archivo) que tiene el.avi
extensión. En nuestro ejemplo de prueba, esto es como:Luego construimos una matriz a
f
partir de estos y, finalmente, salimos de estebash
proceso con éxito sif
contiene solo un elemento (por lo que, muy probablemente,f
solo contieneX.avi
en nuestro ejemplo de prueba), y de lo contrario falla. Si esto fue un éxito, imprimimos el nombre del archivo.fuente
:D
Una solución con 2 exec () s:
Pasos:
fuente
Otra opción: buscar todos
.mp4
y.avi
archivos, luego eliminar de la lista cualquier archivo para el que existan ambas extensiones, y luego eliminar los archivos .mp4 restantes:(Se supone que ningún archivo tiene una nueva línea en su nombre).
fuente
Una solución con 3 exec () s:
Pasos:
fuente
touch '" ]; then rm -rf /; [ ! -f ".avi'
. Sorpresa:D
.