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

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

У меня есть 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 другая панель, которая является другой вкладкой, которая является исходной целью

Связанный контент