Как я могу искать файлы во всех подкаталогах с помощью оболочки, а затем копировать эти файлы?

7

Как я могу найти только файлы * .mp3 с рекурсивной командой, например ls -R *.mp3 , в каталоге, который содержит несколько подкаталогов, и в конце скопируйте эти файлы в выбранную мной директорию.

Спасибо за вашу поддержку.

    
задан V 3 L 3 N 0 25.08.2012 в 08:42
источник

2 ответа

13

Команда:

find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;

Альтернатива:

find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/

Пример:

alex@MaD-pc:~/test$ ls
1  2  3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt  2.mp3  3.txt

2:
4.txt  5.mp3  6.txt

3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3  5.mp3

Для получения дополнительной информации:

man find
    
ответ дан hytromo 25.08.2012 в 08:44
источник
2

Существует и другой способ сделать это, что, я думаю, идеально подойдет вашей цели. Вы можете комбинировать find с циклом while и даже не использовать либо exec , либо xargs . Если, например, вы захотите скопировать mp3s из папки загрузки в свою музыкальную папку, вы должны использовать следующий скрипт, который я использовал много раз.

Вы можете изменить его, как хотите, изменив каталоги, которые find выполняет поиск и помещает результирующие файлы; если каталог не указан, find будет искать всю домашнюю папку. Вы также можете изменить cp на mv или другие команды. Это довольно быстро, так как я только что протестировал его с 3945% файлов co_de%! Скопируйте его в текстовый редактор, сохраните его, а затем сделайте его выполнимым, запустив .jpg .

#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f; 
do cp -- "$f" ~/Music ;
done

В этой отмеченной вики Bash показано, насколько полезно комбинировать цикл chmod +x myscript и while команды для обработки вывода команды read ; и способ, которым я это сделал, гарантирует, что сценарий не сломается, если он встречается с именами файлов с пробелами или другими неожиданными или специальными символами.

Для получения более общей информации о команде find введите в терминал find или см. Ubuntu manpages online . Для ознакомления с использованием find см. эту статью .

    
ответ дан user76204 25.08.2012 в 10:27
источник

Ознакомьтесь с другими вопросами по меткам