2010-06-30 3 views
9

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

Кто-нибудь знает о команде ls или grep, чтобы справиться с этой задачей?

У меня есть это много:

ls -al | grep "[0-9].php" 

ответ

-4

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

ls [0-9]* 

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

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

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

+2

Несомненно это зависит от оболочки? Например, 'bash' не рассматривал бы это как регулярное выражение. Попробуйте, и вы увидите, что он совпадает с файлом _any_, чье имя начинается с числа. – Troubadour

+0

На самом деле я бегу bash, и он отлично работал. Это было слишком просто. Спасибо за решение. Я использовал cp [0-9] * – gurun8

+0

@ gurun8: вам повезло, что у вас тогда не было файлов с нечисловыми символами. – Troubadour

6

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

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

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

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

\. escape dot, иначе это означает «любой символ».

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

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

+2

Не используйте команду ls в скриптах он предназначен только для интерактивного использования. – Philipp

+0

@Philipp: Никто не упоминал сценарии. – Troubadour

+1

@Troubadour: Труба в 'grep' делает ее« скриптом ». –

4

Использование находкой:

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

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

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

+1

+1 для использования find – zdav

+2

, но нет +1 для его использования таким образом. Это сломает имена файлов с пробелами или символами новой строки. Вместо этого используйте 'find. -regex '^ [0-9] + \. php' -exec mv '{}' dest/';' 'или' xargs -0'. – Philipp

+0

@Philipp: Спасибо, это более здорово. У меня сложилось впечатление, что исходный набор названий файлов не содержит пробелов, но безопаснее, конечно, лучше. – unwind

2

Либо использовать find (возможно, в сочетании с -XXXdepth вариантов):

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

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

pattern='^[0-9]+\.php$' 
for file in *.php 
do 
    [[ $file =~ $pattern ]] && echo "$file" 
done 

Не используйте ls или grep.

7

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

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

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

123.php 
9.php 

но не

a.php 
2b.php 
c3.php 
Смежные вопросы