У меня есть список файлов с числовыми именами файлов (например, #.php, ##.php или ###.php), что я хотел бы копировать/перемещать одним махом.
Делает любой знает о ls
или grep
комбинированная команда для выполнения этой цели?
У меня действительно есть это очень:
ls -al | grep "[0-9].php"
Вы можете использовать регулярное выражение при перечислении файлов:
ls [0-9]*
Это был простой и минималистичный подход к вышеуказанной проблеме, но я думаю, что лучшим решением является
ls -al | grep -E '^[0-9]+\.php$'
, как объясняет UncleZeiv ниже .
Используйте find:
$ find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'
Обратите внимание, что аргумент -regex
выполняет поиск, а не сопоставление, поэтому ^ используется для привязки его к началу. Это также предполагает, что файлы находятся в том же каталоге (.), Что и тот, в котором вы находитесь при выполнении команды.
Уловка {}
в команде mv
заменена на find
с найденным именем файла.
В Bash вы можете использовать расширенное сопоставление с образцом:
shopt -s extglob
ls -l +([0-9]).php
, которое найдет такие файлы, как:
123.php
9.php
, но не
a.php
2b.php
c3.php
Измените его следующим образом:
ls -al | grep -E '^[0-9]+\.php$'
-E
активирует расширенные регулярные выражения.
+
требует, чтобы появилось хотя бы одно вхождение предыдущей группы.
\.
экранирующая точка, иначе она означает "любой символ."
^
и $
для соответствия всему имени файла, а не только его части.
Одинарные кавычки для предотвращения расширения переменной (она будет жаловаться из-за $
).
Либо используйте find
(возможно, в сочетании с опциями -XXXdepth
):
find . -mindepth 1 -maxdepth 1 -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'
Либо используйте встроенные возможности regex:
pattern='^[0-9]+\.php$'
for file in *.php
do
[[ $file =~ $pattern ]] && echo "$file"
done
Не используйте ls
или grep
.