我有以下设置,我想找到并移动文件。
我有/home/backup/abc/123.wav
和/home/backup/xyz/456.wav
个文件。
/usr/src/abc
和/usr/src/xyz
存在相同的目录,但没有任何文件。
我想从home_dir中找到.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)。
有可能实现我想要的吗? 请建议。
答案 0 :(得分:1)
使用cp --parents
选项与find
一起创建要复制的每个文件的父目录:
home_dir=/home/backup/
dest_dir=/usr/src/
cd "$home_dir"
find . -iname "*.wav" -exec cp --parents {} "$dest_dir" \; -delete
答案 1 :(得分:0)
如果mv
有--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