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

Find and move files to appropriate directories using shell script

我有以下设置,我想查找和移动文件。

我有文件 /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) .

有没有可能实现我想要的? 请推荐。

使用 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 选项,这会容易得多,但不幸的是它没有。最好使用 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