Скопируйте определенные файлы (имена которых сохранены в списке) из одной папки в другую

У меня почти 4 файла lakhs (400 000) в папке с именем model, и из этой папки я выбрал несколько тысяч файлов, а их имена сохранены в id.txt. Теперь я хочу взять только файлы, перечисленные в id.txt из папки model, и скопировать их в другую папку с именем selected_ids.

Две папки находятся внутри того же каталога test, который содержит

model selected_ids id.txt

id.txt содержит имена файлов один за другим, например:

ENSP00000290866.4_2.pdb.xz 385719215_2.pdb.xz GENSCAN00000006392_3.pdb.xz

Папка модели содержит почти 3 файла lakh

ENSP00000290866.4_2.pdb.xz 385719215_2.pdb.xz GENSCAN00000006392_3.pdb

* note: в папке некоторые файлы имеют расширение .pdb.xz и некоторые только .pdb

Я знаю, как скопировать один файл из одной папки в другую, как это

cp model/ENSP00000290866.4_2.pdb.xz selected_ids/

Но у меня есть тысячи и тысячи файлов для копирования за короткое время.

Может ли кто-нибудь дать эффективную команду для копирования файлов?

3
задан 23 July 2017 в 12:10

6 ответов

Предполагая, что в входном файле нет белых пробелов, вы можете просто использовать цикл for:

for f in $(<id.txt); do cp -v "model/$f" selected_ids/;done

Если у вас возникли проблемы с «\ r» в конце имен файлов (скорее всего, файл был сохранен в ОС семейства Windows), вам также необходимо обрезать переменную $f:

for f in $(<id.txt); do f=`echo $f|tr -d "\n\r"`; cp -v "model/$f" selected_ids/; done

Обратите внимание, что cp с опцией -v отображает текущий файл, который копируется, поэтому его легко проверить этот процесс пакетного копирования.

0
ответ дан 18 July 2018 в 10:01

Используйте структуру while IFS= read -r variable; do... done < input.txt, чтобы читать файл по строкам и выполнять желаемый код в .... Это стандартный способ bash читать файл по очереди и действовать на него. С каталогом, как вы описали, это должно быть сделано так:

$ tree . ├── 385719215_2.pdb.xz ├── ENSP00000290866.4_2.pdb.xz ├── GENSCAN00000006392_3.pdb.xz ├── id.txt ├── model └── selected_ids 2 directories, 4 files $ while IFS= read -r file; do cp "$file" selected_ids/"$file" ;done < id.txt $ tree . ├── 385719215_2.pdb.xz ├── ENSP00000290866.4_2.pdb.xz ├── GENSCAN00000006392_3.pdb.xz ├── id.txt ├── model └── selected_ids ├── 385719215_2.pdb.xz ├── ENSP00000290866.4_2.pdb.xz └── GENSCAN00000006392_3.pdb.xz
0
ответ дан 18 July 2018 в 10:01

следующая команда:

cd /path/to/model $ xargs -d '\n' -a /path/to/id.txt cp -t /path/to/selected_ids

это будет читать имя файла, сохраненное в id.txt, и копировать в каталог selected_ids.

4
ответ дан 18 July 2018 в 10:01

Предполагая, что в входном файле нет белых пробелов, вы можете просто использовать цикл for:

for f in $(<id.txt); do cp -v "model/$f" selected_ids/;done

Если у вас возникли проблемы с «\ r» в конце имен файлов (скорее всего, файл был сохранен в ОС семейства Windows), вам также необходимо обрезать переменную $f:

for f in $(<id.txt); do f=`echo $f|tr -d "\n\r"`; cp -v "model/$f" selected_ids/; done

Обратите внимание, что cp с опцией -v отображает текущий файл, который копируется, поэтому его легко проверить этот процесс пакетного копирования.

0
ответ дан 24 July 2018 в 19:29

Используйте структуру while IFS= read -r variable; do... done < input.txt, чтобы читать файл по строкам и выполнять желаемый код в .... Это стандартный способ bash читать файл по очереди и действовать на него. С каталогом, как вы описали, это должно быть сделано так:

$ tree . ├── 385719215_2.pdb.xz ├── ENSP00000290866.4_2.pdb.xz ├── GENSCAN00000006392_3.pdb.xz ├── id.txt ├── model └── selected_ids 2 directories, 4 files $ while IFS= read -r file; do cp "$file" selected_ids/"$file" ;done < id.txt $ tree . ├── 385719215_2.pdb.xz ├── ENSP00000290866.4_2.pdb.xz ├── GENSCAN00000006392_3.pdb.xz ├── id.txt ├── model └── selected_ids ├── 385719215_2.pdb.xz ├── ENSP00000290866.4_2.pdb.xz └── GENSCAN00000006392_3.pdb.xz
0
ответ дан 24 July 2018 в 19:29
  • 1
    Ubuntu 17.04: The program 'tree' is currently not installed. You can install it by typing: sudo apt install tree – madneon 29 July 2017 в 00:26
  • 2
    @madneon Да, это не программа по умолчанию, но tree не имеет значения, насколько вопрос идет, она используется здесь только для того, чтобы дать представление о том, как структурирован каталог. Важной частью является цикл while – Sergiy Kolodyazhnyy 29 July 2017 в 00:36

следующая команда:

cd /path/to/model $ xargs -d '\n' -a /path/to/id.txt cp -t /path/to/selected_ids

это будет читать имя файла, сохраненное в id.txt, и копировать в каталог selected_ids.

4
ответ дан 24 July 2018 в 19:29
  • 1
    @ AFSHIN linux [model_1] xargs -d '\ n' -a ../id_original.txt cp -t ../selected_ids Я получаю следующую непрерывную ошибку: cp: не может stat `GENSCAN00000051451_3.pdb.xz \ r ': Нет такой файл или каталог .................... Но когда я проверил в папке модели, он показывает, что присутствует конкретный файл, найдите. -name GENSCAN00000051451_3.pdb.xz ./GENSCAN00000051451_3.pdb.xz Я наблюдаю, что некоторые файлы могут читать, когда я взял 30 идентификаторов и запустил скрипт, но не весь файл. В папке model_1 есть также файлы с именем .pdb и .pdb.xz. – Nitha 20 July 2017 в 15:26
  • 2
    Шаг фильтрации, выполняемый для каждой структуры .pdb в excel и отфильтрованной лучшей модели. Только их идентификационное имя было сохранено как id.txt – Nitha 20 July 2017 в 22:15
  • 3
    Я изменил и запустил комментарий, но все же он показывает ошибку. xargs -d '\ n' -a ../id_original.txt cp -t ../selected_models error: cp: не может stat ENSP00000474609.1_2.pdb.xz\r': No such file or directory xargs -d '\n' -a ../id_original.txt cp -t ../selected_models error: cp: cannot stat \ nGENSCAN00000001365_1.pdb.xz ': Нет такого файла или каталога – Nitha 21 July 2017 в 07:19
  • 4
    Нет .. файлы присутствуют внутри папки модели GENSCAN00000001365_1.pdb.xz @ bio-linux [model_1] find. -name GENSCAN00000001365_1.pdb.xz [9:47 AM] ./GENSCAN00000001365_1.pdb.xz – Nitha 21 July 2017 в 07:38
  • 5
    покажите мне ваш id.txt content run cat -eT id.txt, вы можете вставить здесь paste.ubuntu.com и поделиться ссылкой – αғsнιη 21 July 2017 в 08:19

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

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