我有下面的设置,我想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