2016-02-24 8 views
3

У меня есть настройка, и я хочу найти и переместить файлы.Найти и переместить файлы в соответствующие каталоги с помощью сценария оболочки

У меня есть файлы /home/backup/abc/123.wav и /home/backup/xyz/456.wav. Эти же каталоги существуют на /usr/src/abc и /usr/src/xyz которые не имеют файлов.

Я хочу найти файлы .wav из home_dir и переместить их в определенный 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/а и/USR/SRC/А).

Можно ли достичь того, чего я хочу? Пожалуйста, предложите.

ответ

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-файлы генерируются случайным образом, поэтому, если я использую команду delete после команды копирования, есть ли шансы удалить любой файл, который не будет скопирован? – 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