2010-06-30 39 views

Respuesta

-4

Puede utilizar expresiones regulares al enumerar los archivos:

ls [0-9]* 

Este fue un enfoque sencillo y minimalista en el problema anterior, pero creo que la mejor solución es

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

como UncleZeiv explica below.

+2

Seguramente esto depende del caparazón? Por ejemplo 'bash' no trataría eso como una expresión regular. Pruébalo y verás que coincide con cualquier archivo cuyo nombre comience con un número. – Troubadour

+0

En realidad estoy ejecutando bash y funcionó perfectamente. Esto fue demasiado simple. Gracias por la solución. Usé cp [0-9] * – gurun8

+0

@ gurun8: Tuviste suerte de que no tenías ningún archivo con caracteres no numéricos en su nombre. – Troubadour

6

enmendarla como esto:

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

-E activa las expresiones regulares extendidas.

requiere que aparezca al menos una aparición del grupo anterior.

\. escape dot de lo contrario significa "cualquier personaje".

^ y $ para que coincida con el nombre completo del archivo y no solo una parte.

Comillas simples para evitar la expansión variable (se quejaría debido a $).

+2

No utilice 'ls' en scripts, está destinado solo para uso interactivo. – Philipp

+0

@Philipp: Nadie mencionó las secuencias de comandos. – Troubadour

+1

@Troubadour: El conducto en 'grep' lo convierte en un" script ". –

4

Uso hallazgo:

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

Tenga en cuenta que el argumento -regex hace una búsqueda, no un partido, por lo que el^está ahí para anclarlo a la salida. Esto también asume que los archivos están en el mismo directorio (.) Que el que está al ejecutar el comando.

El truco {} en el comando mv se reemplazó por find con el nombre del archivo encontrado.

+1

+1 para usar find – zdav

+2

pero no +1 para usarlo de esta manera. Esto afectará los nombres de archivo con espacios o líneas nuevas. En su lugar use 'find. -regex '^ [0-9] + \. php' -exec mv '{}' dest/';' ', o' xargs -0'. – Philipp

+0

@Philipp: Gracias, eso es más robusto. Me dio la impresión de que el conjunto de nombres de los carteles originales no contenía espacios, pero estar seguro es mejor, por supuesto. – unwind

2

O bien utilizar find (posiblemente en combinación con las opciones -XXXdepth):

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

O utilizar las capacidades incorporadas de expresiones regulares:

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

No utilice ls o grep.

7

En Bash, puede utilizar extendida coincidencia de patrones:

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

que encontrar archivos tales como:

123.php 
9.php 

pero no

a.php 
2b.php 
c3.php 
Cuestiones relacionadas