У меня есть список файлов как это (длинный список, не все):
И я хочу отфильтровать файлы с ключевыми словами "QM" и ".h5", таким образом, я ввожу ls|grep "QM"|grep "h5"
и это показывает их (в чем я нуждаюсь),
Так в основном я хочу переместить эти файлы в другой каталог, но я не знаю, как переместить их с одной строкой сценария.
Кроме того, есть ли способ случайным образом выбрать 5 этих файлов и скопировать их в другой каталог?
Шарики 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:
"Много файлов"? "Файлы с забавными символами на их имя"?
Это призывает 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
".