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

3
我有以下的设置,我想要查找并移动文件。
我有文件 /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个回答

1
使用find命令的cp --parents选项可以创建每个被复制文件的父目录:
home_dir=/home/backup/
dest_dir=/usr/src/
cd "$home_dir"

find . -iname "*.wav" -exec cp --parents {} "$dest_dir" \; -delete

我想移动这些文件。当我使用以下命令时: find . -iname "*.wav" -exec cp --parents {} "$dest_dir" ; .wav 文件被复制为 123 和 456,而不是 123.wav 和 456.wav。 - rutu
在我建议的cp命令之后,您可以使用find . -iname "*.wav" -delete从源目录中删除所有文件。 - anubhava
.wav 文件是随机生成的,所以如果我在复制命令后使用删除命令,有没有可能删除未被复制的文件? - rutu
你可以在同一个 find 命令中同时执行这两个操作:find . -iname "*.wav" -exec cp --parents {} "$dest_dir" \; -delete - anubhava

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

我也会尝试这个。谢谢。 - rutu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接