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

时间:2016-02-24 07:35:24

标签: linux bash shell find mv

我有以下设置,我想找到并移动文件。

我有/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)。

有可能实现我想要的吗? 请建议。

2 个答案:

答案 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