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


у меня так много файлов в 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
2018-04-02 08:56


Источник


Привет, Дэвид, я написал ответ, который использует find, что ИМО - самый простой способ выполнить эту работу. Если вам нужно создать сценарий bash, здесь предоставляются два варианта, которые решают одну и ту же задачу: askubuntu.com/a/1020671/566421 - pa4080


Ответы:


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

find ~/wav/train/S* -type f -name "*.wav" -exec echo mv {} ~/wav/train/wavs/ \;
  • ~/wav/train/S* это путь поиска, и он будет соответствовать каждому поддиректору, который начинается с 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
2018-04-02 09:50