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

у меня есть столько файлов в соответствии с 300 различными каталогами, деревом файла как:

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

... и т.д.

Я хочу соединить их в соответствии с тем же каталогом, как:

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

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

Я кодировал эту часть сценария удара:

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

1 ответ

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

find ~/wav/train/S* -type f -name "*.wav" -exec echo mv {} ~/wav/train/wavs/ \;
  • ~/wav/train/S* путь поиска, и он будет соответствовать к каждому sub 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
ответ дан 7 December 2019 в 15:22

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

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