2016-02-24 39 views
3

我有以下設置,我想找到並移動文件。使用shell腳本查找和移動文件到合適的目錄

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

是否有可能實現我想要的? 請建議。

回答

1

使用cp --parents選項與find創建的每個文件的父目錄被複制:

home_dir=/home/backup/ 
dest_dir=/usr/src/ 
cd "$home_dir" 

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

我想移動files.When我用 發現。 -iname「* .wav」-exec cp --parents {}「$ dest_dir」\; .wav文件複製爲123和456而不是123.wav和456.wav。 – rutu

+0

在我建議的'cp'命令後,您可以使用'find。 -iname「* .wav」-delete「從源目錄中刪除所有文件。 – anubhava

+0

.wav文件是隨機生成的,所以如果我在複製命令後使用刪除命令,是否有機會刪除任何不會被複制的文件? – rutu

0

這將是一個容易得多,如果mv--parents選項,但遺憾的是它沒有。最好使用mv而不是cp,因爲cp會在源目錄和目標目錄位於同一文件系統時不必要地複製所有數據。如果你已經有了擊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 
+0

我也會試試。謝謝。 – rutu

相關問題