у меня есть столько файлов в соответствии с 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
Возможно, самый простой способ сделать это задание командой 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