Как перемещать файлы в нескольких каталогах в один и тот же каталог?

У меня так много файлов в 300 разных директориях, дерево файлов вроде:

--s1 - ----abc - ----bcd --s2 - ----123 - ----234

... и т. д.

Я хочу объединить их в один каталог, например:

--whole - ----abc - ----bcd - ----123 - ----234 ...

Есть ли какой-нибудь полезный скрипт bash на практике?

Я закодировал этот фрагмент сценария bash:

mkdir wavs for ((i=1;i<=9;i++)); do cd ~/wav/train/S000$i mv * ~/wav/train/wavs cd .. done for ((i=10;i<=99;i++)); do cd ~/wav/train/S00$i mv * ~/wav/train/wavs cd .. done for ((i=100;i<=917;i++)); do cd ~/wav/train/S0$i mv * ~/wav/train/wavs cd .. done echo "ok"

, но я получил ошибка, которую я не понимаю:

./untar.sh: line 24: cd: /wav/train/S0917: No such file or directory cp: target '/wav/train/wavs/' is not a directory ok
1
задан 2 April 2018 в 13:13

3 ответа

Возможно, самый простой способ выполнить это задание - командой find (по умолчанию он работает рекурсивно):

find ~/wav/train/S* -type f -name "*.wav" -exec echo mv {} ~/wav/train/wavs/ \;
~/wav/train/S* - это путь поиска, и он будет соответствовать каждому подпункту dir, который начинается с S. -type f ограничит поиск только файлами. -name "*.wav" ограничит поиск только файлами, которые заканчиваются на .wav. Не обязательно. -exec ... \; выполнит указанную команду один раз для каждого совпадения поиска. {} - переменная, содержащая элемент совпадения. удалите echo из команды echo mv {} ~/wav/train/wavs/, чтобы выполнить действие.

Далее, если вы хотите удалить каталоги, вы можете использовать команду в качестве одного из следующих:

find ~/wav/train/S* -type d -name "S*" -exec echo rm -r {} \;
find ~/wav/train/S* -type d -name "S*" -delete
1
ответ дан 22 May 2018 в 11:39
  • 1
    Огромное спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! – David Aksnes 2 April 2018 в 15:50

Возможно, самый простой способ выполнить это задание - командой find (по умолчанию он работает рекурсивно):

find ~/wav/train/S* -type f -name "*.wav" -exec echo mv {} ~/wav/train/wavs/ \; ~/wav/train/S* - это путь поиска, и он будет соответствовать каждому подпункту dir, который начинается с S. -type f ограничит поиск только файлами. -name "*.wav" ограничит поиск только файлами, которые заканчиваются на .wav. Не обязательно. -exec ... \; выполнит указанную команду один раз для каждого совпадения поиска. {} - переменная, содержащая элемент совпадения. удалите echo из команды echo mv {} ~/wav/train/wavs/, чтобы выполнить действие.

Далее, если вы хотите удалить каталоги, вы можете использовать команду в качестве одного из следующих:

find ~/wav/train/S* -type d -name "S*" -exec echo rm -r {} \; find ~/wav/train/S* -type d -name "S*" -delete
1
ответ дан 17 July 2018 в 17:38

Возможно, самый простой способ выполнить это задание - командой find (по умолчанию он работает рекурсивно):

find ~/wav/train/S* -type f -name "*.wav" -exec echo mv {} ~/wav/train/wavs/ \; ~/wav/train/S* - это путь поиска, и он будет соответствовать каждому подпункту dir, который начинается с S. -type f ограничит поиск только файлами. -name "*.wav" ограничит поиск только файлами, которые заканчиваются на .wav. Не обязательно. -exec ... \; выполнит указанную команду один раз для каждого совпадения поиска. {} - переменная, содержащая элемент совпадения. удалите echo из команды echo mv {} ~/wav/train/wavs/, чтобы выполнить действие.

Далее, если вы хотите удалить каталоги, вы можете использовать команду в качестве одного из следующих:

find ~/wav/train/S* -type d -name "S*" -exec echo rm -r {} \; find ~/wav/train/S* -type d -name "S*" -delete
1
ответ дан 23 July 2018 в 18:30

Другие вопросы по тегам:

Похожие вопросы: