使用 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
我有以下设置,我想查找和移动文件。
我有文件 /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