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