Me gustaría copiar todos los archivos de un directorio excepto uno llamado Default.png. Parece que hay varias formas de hacer esto. ¿Qué te parece más efectivo?
Me gustaría copiar todos los archivos de un directorio excepto uno llamado Default.png. Parece que hay varias formas de hacer esto. ¿Qué te parece más efectivo?
Respuestas:
Simple, si src/
solo contiene archivos:
find src/ ! -name Default.png -exec cp -t dest/ {} +
Si src/
tiene subdirectorios, esto los omite, pero copia archivos dentro de ellos:
find src/ -type f ! -name Default.png -exec cp -t dest/ {} +
Si src/
tiene subdirectorios, esto no se repite en ellos:
find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +
\;
ejecuta el comando una vez por archivo. +
ejecuta el comando una vez y le pasa todos los nombres de archivo a la vez (sujeto al límite de longitud de la línea de comando). +
es un poco más eficiente en general.
Debe ser como sigue:
cp -r !(Default.png) /dest
Si copia a una carpeta anidada en la carpeta actual (llamada ejemplo en el caso siguiente), también debe omitir ese directorio:
cp -r !(Default.png|example) /example
shopt -s extglob
que funcione, si se ha desactivado.
shopt -s extglob
como lo describe @BarryKelly. Con eso, funciona perfectamente.
!()
... ¡Hermoso! Para aquellos que, como yo, sienten que es hora de estudiar / revisar bash , aquí están los enlaces relevantes relacionados con esta pregunta / respuesta: shopt / extglob y el patrón .
rsync ha sido mi reemplazo de cp / scp durante mucho tiempo:
rsync -av from/ to/ --exclude=Default.png
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-r
argumento si estás sincronizando directorios
Yo solo haría:
cp srcdir/* destdir/ ; rm destdir/Default.png
a menos que los archivos sean grandes. De lo contrario, utilice, por ejemplo,
find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/
Default.png
existe en los dos directorios, reemplazará el que está en destdir
por el que está en srcdir
, luego eliminará el copiado Default.png
. En cambio, el OP quiere mantener lo Default.png
que ya existe destdir
.
Esto funciona muy bien para copiar todo excepto los módulos de nodo :) disfrútelo y gracias a las respuestas anteriores que acabo de agregar. En mi opinión, Rsync es mejor que CP, ya que puede ver la barra de progreso sin pedirla.
rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
usar el parámetro de expansión del shell con expresiones regulares
cp /<path>/[^not_to_copy_file]* .
Todo se copiará excepto el not_to_copy_file
- si algo anda mal con esto. Por favor especifica !
[...]
) contiene un conjunto de caracteres para coincidir, mientras que un interlineado ^
provocará una coincidencia del complemento de los caracteres enumerados. En el siguiente ejemplo, ni el archivo aparecerá en la lista: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*
porque serán excluidos todos los nombres de archivo que comienzan con cualquiera de los siguientes caracteres: _cefilnopty
.