Перечислите только числовые имена файлов в каталоге

У меня есть список файлов с числовыми именами файлов (например, #.php, ##.php или ###.php), что я хотел бы копировать/перемещать одним махом.

Делает любой знает о ls или grep комбинированная команда для выполнения этой цели?

У меня действительно есть это очень:

ls -al | grep "[0-9].php"
11
задан skaffman 30 June 2010 в 16:48
поделиться

5 ответов

Вы можете использовать регулярное выражение при перечислении файлов:

ls [0-9]*

Это был простой и минималистичный подход к вышеуказанной проблеме, но я думаю, что лучшим решением является

ls -al | grep -E '^[0-9]+\.php$'

, как объясняет UncleZeiv ниже .

-2
ответ дан 3 December 2019 в 06:20
поделиться

Используйте find:

$ find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'

Обратите внимание, что аргумент -regex выполняет поиск, а не сопоставление, поэтому ^ используется для привязки его к началу. Это также предполагает, что файлы находятся в том же каталоге (.), Что и тот, в котором вы находитесь при выполнении команды.

Уловка {} в команде mv заменена на find с найденным именем файла.

4
ответ дан 3 December 2019 в 06:20
поделиться

В Bash вы можете использовать расширенное сопоставление с образцом:

shopt -s extglob
ls -l +([0-9]).php

, которое найдет такие файлы, как:

123.php
9.php

, но не

a.php
2b.php
c3.php
8
ответ дан 3 December 2019 в 06:20
поделиться

Измените его следующим образом:

ls -al | grep -E '^[0-9]+\.php$'

-E активирует расширенные регулярные выражения.

+ требует, чтобы появилось хотя бы одно вхождение предыдущей группы.

\. экранирующая точка, иначе она означает "любой символ."

^ и $ для соответствия всему имени файла, а не только его части.

Одинарные кавычки для предотвращения расширения переменной (она будет жаловаться из-за $).

7
ответ дан 3 December 2019 в 06:20
поделиться

Либо используйте 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.

2
ответ дан 3 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

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