使用shell脚本查找和移动文件到适当的目录

我有下面的设置,我想find并移动文件。

我有文件/home/backup/abc/123.wav/home/backup/xyz/456.wav 。 相同的目录存在于/usr/src/abc/usr/src/xyz ,没有任何文件。

我想从home_dir中find.wav文件并将它们移到特定的dest_dir。

所以123.wav应该移到/ usr / src / abc,456.wav应该移到/ usr / src / xyz。 我正在使用下面的命令。

 home_dir=/home/backup/ dest_dir=/usr/src/ cd $home_dir && find . -iname "*.wav" -exec mv {} $dest_dir \; 

但所有的.wav文件(123.wav和456.wav)都移动到/ usr / src而不是它的相应目录(/ usr / src / abc和/ usr / src / xyz)。

是否有可能实现我想要的? 请build议。

使用cp --parents选项和find来创建每个被复制文件的父目录:

 home_dir=/home/backup/ dest_dir=/usr/src/ cd "$home_dir" find . -iname "*.wav" -exec cp --parents {} "$dest_dir" \; -delete 

如果mv有一个--parents选项,这将会容易--parents ,但不幸的是它没有。 最好使用mv而不是cp因为如果源目录和目标目录在同一个文件系统上, cp将不必要地复制所有的数据。 如果你有Bash 4(支持globstar ),你可以这样做:

 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