Как копировать/перемещать файлы больше чем с двумя ключевыми словами

У меня есть список файлов как это (длинный список, не все):

enter image description here И я хочу отфильтровать файлы с ключевыми словами "QM" и ".h5", таким образом, я ввожу ls|grep "QM"|grep "h5" и это показывает их (в чем я нуждаюсь), enter image description here

Так в основном я хочу переместить эти файлы в другой каталог, но я не знаю, как переместить их с одной строкой сценария.

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

0
задан 1 January 2020 в 06:49

3 ответа

Шарики Shell будут Вашими друзьями здесь.

Например, вместо использования grep, можно перечислить все файлы, имена которых содержат QM и конец с .h5 использование

ls *QM*.h5

Можно использовать шарики в mv и cp операции при условии, что количество соответствия файлам не является слишком большим

cp *QM*.h5 path/to/new_dir/

Если количество файлов является слишком большим, можно добраться argument list too long ошибка; можно работать вокруг того использования оболочки printf встроенный с xargs повредить копию в управляемые блоки:

printf '%s\0' *QM*.h5 | xargs -0 cp -t path/to/new_dir/

С ударом нет никакого внутреннего способа ограничить количество выбранных файлов (или выбрать случайное подмножество), но Вы могли сделать так путем добавления вызова к shuf:

printf '%s\0' *QM*.h5 | shuf -zn5 | xargs -0 cp -t path/to/new_dir/

Обратите внимание, что я использовал пустой байт \0 вместо символа новой строки для разграничивания списка имен файлов - это не необходимо в случае, но делает команду применимой в более общем случае, где сами имена файлов могут содержать новые строки.

Если Вы не возражаете переключаться на оболочку z zsh, затем можно выбрать случайное подмножество, не обращаясь к внешним утилитам, с помощью более выразительных спецификаторов шарика оболочки:

cp -t path/to/new_dir/ *QM*.h5(Nnoe['REPLY=$RANDOM'][1,5])        # zsh only

Связанный вопрос на нашем родственном сайте Unix & Linux:

1
ответ дан 11 January 2020 в 09:46

"Много файлов"? "Файлы с забавными символами на их имя"?

Это призывает find и xargs!

Читать man find;man xargs и сделайте что-то как:

find . -maxdepth 1 -name '*QM*.h5' -print0 |\
  xargs -0 --no-run-if-empty mv --target-directory=AnotherDirectory

Примечание:"AnotherDirectory"должен уже существовать.

Примечание: Посмотрите то, чем результаты будут заменой initaiily"mv"с"echo mv".

1
ответ дан 11 January 2020 в 09:46

Просто cp *QM*.h5 target_dirи сделанный.

0
ответ дан 11 January 2020 в 09:46

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

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