У меня есть 220 каталогов, в каждом из которых по 2 файла. Все файлы имеют одинаковое окончание (*.fq.gz). Я хочу переместить все эти файлы в один уникальный каталог.
Думаю, я мог бы сделать это с помощью цикла из ракушек, но не имею ни малейшего представления, как это сделать...
решение1
Это то, что я использую, когда мне не нужно быть особенно осторожным.
mkdir unique_dir && mv */*.fq.gz unique_dir/
Если только я ничего не пропустил.
решение2
Вы правы. Эту задачу можно выполнить с помощью двух циклов for. Один внутри другого. Мы создадим скрипт bash, который сделает именно это. Давайте посмотрим, как это будет выглядеть:
#!/bin/bash
for dir in */; do
echo "$dir"
cd "$dir"
for file in *; do
echo "moving $file"
mv $file ~/targetdir
done
cd ..
done
Если вы хотите иметь более быстрый скрипт, просто удалите эхо из скрипта. Я сделал это, чтобы было легче отслеживать его ход.
Просто создайте файл и скопируйте в него эти команды. После этого дайте ему разрешение на выполнение с помощью chmod +x scriptfile
и запустите его с помощью ./scriptfile
в главном каталоге, где находятся другие каталоги. Не забудьте заменить targetdir и scriptfile на ваш целевой каталог и имя файла скрипта.
Если в ваших каталогах больше файлов, просто замените *
на *.fq.gz
в for file
цикле, и он будет проходить только по вашим двум файлам.
Внимание!!! Не создавайте целевой каталог внутри основного каталога, так как он также будет итерироваться внутри него.
Редактировать: как предложил @steeldriver, можно удалить for dir
команды и просто использовать for file
команды с */*.fq.gz
для более быстрого цикла. Я решил сохранить их для лучшего отслеживания того, что происходит внутри каталогов.
Редактировать: Пока я проводил некоторые исследования на man и веб-страницах команд find и xarg, на которые ответил @waltinator, я нашел это более удобным, быстрым и безопасным. Я даже нашел альтернативу xarg, используя опцию -exec команды find, например find . -type f -name '*.fq.gz' -exec mv --backup=numbered --target-directory=$dest {} \;
.
решение3
При работе с большим количеством файлов или файлов со странными именами, find
и xargs
являются инструментами для использования. Прочитайте man find;man xargs
и сделайте что-нибудь вроде:
dest=../destination # must be outside this directory tree
mkdir $dest
find . -type f -name '*.fq.gz' -print0 |\
xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest
Когда вы будете удовлетворены результатами, замените « echo mv
» просто на « mv
».
Чтобы исключить $dest
проблему «находится в текущем каталоге», используйте --prune
:
find . -type d -name "$dest" -prune -o -type f -name '*.fq.gz' -print0 |\
xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest
решение4
krusader can search files and save to a custom tab then you can select all of those (or filter the list) and move them to the destination
sudo apt install krusader
Вы могли бы также добавить
sudo apt install krename
перейдите в самый верхний исходный каталог tools, search или crtl+s щелкните feed в списке edit выберите все файлы, скопируйте на другую панель или f5 другая панель, которая является другой вкладкой, которая является исходной целью