Tengo la siguiente configuración y quiero buscar y mover archivos.
Tengo los archivos /home/backup/abc/123.wav
y /home/backup/xyz/456.wav
. Existen los mismos directorios en /usr/src/abc
y /usr/src/xyz
que no tiene ningún archivo.
Quiero encontrar archivos .wav desde home_dir y moverlos a dest_dir en particular.
Entonces 123.wav debería moverse a /usr/src/abc y 456.wav debería moverse a /usr/src/xyz. Estoy usando el siguiente comando para eso.
home_dir=/home/backup/ dest_dir=/usr/src/ cd $home_dir && find . -iname "*.wav" -exec mv {} $dest_dir \;
Pero todos los archivos .wav (123.wav y 456.wav) se trasladaron a /usr/src y no a sus respectivos directorios (/usr/src/abc y /usr/src/xyz).
¿Es posible lograr lo que quiero? Por favor recomiende.
Use la opción cp --parents
con find
para crear directorios principales de cada archivo que se copia:
home_dir=/home/backup/ dest_dir=/usr/src/ cd "$home_dir" find . -iname "*.wav" -exec cp --parents {} "$dest_dir" \; -delete
Esto sería mucho más fácil si mv
tuviera la opción --parents
, pero desafortunadamente no la tiene. Es mejor usar mv
en lugar de cp
porque cp
copiará todos los datos innecesariamente si los directorios de origen y destino están en el mismo sistema de archivos. si tiene Bash 4 (que es compatible con globstar
), podría hacerlo así:
home_dir=/home/backup/ dest_dir=/usr/src/ shopt -s globstar nullglob dotglob for src_wav in "$home_dir"/**/*.wav ; do rel_wav=${src_wav#$home_dir/} dst_wav=$dest_dir/$rel_wav dst_parent=${dst_wav%/*} [[ -d $dst_parent ]] || mkdir -p -- "$dst_parent" mv -- "$src_wav" "$dst_wav" done