GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo usar comodines de estilo ms-dos con ls y mv?

Una de las diferencias fundamentales entre Windows cmd y POSIX shells es quien se encarga de las expansiones comodín. Los proyectiles realizan todas las expansiones requeridas antes de iniciar los comandos reales que solicitó. cmd principalmente pasa los patrones comodín a los comandos sin modificar. (Digo principalmente, ya que creo que hay excepciones y las variables de entorno se expanden en la mayoría de las circunstancias). Esto hace que escribir un rename eso funcionaría con la misma sintaxis que en cmd bastante complicado

Pero hay un rename para Linux:con argumentos completamente diferentes, consulte la página de manual (que es un poco concisa en mi sistema, y ​​rename proviene del util-linux paquete en mi sistema, que debería estar ampliamente disponible). Su primer cambio de nombre se haría así:

rename .txt .bak *.txt

Tenga en cuenta que el shell hace el * expansión, entonces rename en realidad piensa que fue invocado así:

rename .txt .bak file1.txt file2.txt file3.txt ...

Entonces puedes adivinar la versión del archivo único:

rename .txt .bak file1.txt

Si no desea utilizar rename pero implemente esto usted mismo, podría crear una función para eso. Suponiendo que solo desea cambiar la extensión del archivo y cambiar el nombre de un solo archivo, mire esto:

$ function chext() {
  newext="$1"
  file="$2"
  newfile="${file%.*}$newext"
  echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfile se crea mediante la eliminación de una subcadena para eliminar la extensión original y luego concatena la nueva extensión. Puede extender esa función para manejar varios archivos con relativa facilidad.

En cuanto a tu ls pregunta, usa el -d cambiar. Esto evitará que ls de enumerar el contenido de los directorios.

Demostración:

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Renombrar comodín

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Cambio de nombre de archivo único

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

El ls predeterminado

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls que no inspecciona directorios

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

Una cosa a tener en cuenta cuando se trata de comodines es que están expandidos por el caparazón. La aplicación no sabe si usó comodines o si escribió los nombres. Por ejemplo, si escribe rename *.txt *.bak , luego el rename comando ve algo como rename file1.txt file2.txt existingfile.bak . Esa no es suficiente información para continuar.

Me ocuparé de la pregunta sobre ls primero, porque es más simple. Si todo lo que desea son los nombres coincidentes, entonces no necesita ls , porque el shell ya está haciendo la expansión.

echo t*

Si desea obtener más información sobre los archivos, pase el -d opción a ls , para decirle que no enumere el contenido de los directorios.

ls -ld t*

No existe una utilidad estándar para renombrar archivos, porque los primeros sistemas Unix no venían con una. El método portátil para cambiar el nombre de los archivos utiliza un bucle y es un poco detallado:

for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done

Hay varias utilidades comunes para cambiar el nombre de los archivos, ninguna de las cuales está garantizada para instalarse en un sistema Unix determinado, pero todas son fáciles de instalar. Aquí están los principales:

  • rename del util-linux suite, disponible en todos los sistemas Linux no integrados (y en ningún otro lugar). En Debian y derivados (incluyendo Ubuntu), este comando se llama rename.ul . Siempre que no se produzca .txt aparte de la extensión final, puede escribir

    rename .txt .bak *.txt
    
  • rename es un script de Perl que Debian y sus derivados envían como /usr/bin/rename . Puede cambiar el nombre de los archivos según los comandos Perl arbitrarios.

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv , que puede renombrar, copiar y vincular archivos de acuerdo con varios patrones basados ​​en nombres y tiene muchas opciones relacionadas con lo que sucede si ya existe un nombre de destino. Tenga en cuenta que debe usar comillas para proteger los comodines de la expansión del shell.

    mmv '*.txt' '#1.txt'
    
  • zmv es una función zsh, disponible si y solo si su shell es zsh. Puede hacer coincidir patrones zsh arbitrarios (por lo que puede hacer coincidir nombres de archivo según expresiones regulares arbitrarias, no solo comodines, y puede hacer coincidir archivos por otros criterios, como fechas y tamaños). zmv también puede copiar y enlazar.

    zmv '(*).txt' '$1.txt'
    

Si tiene algún control sobre las máquinas que usa, mi recomendación es usar zsh como shell (tiene otros beneficios sobre bash) y poner estas líneas en su ~/.zshrc :

autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'

noglob es una función zsh que le dice al shell que no expanda los comodines en el argumento del comando. De esta forma puedes escribir zmv *.txt \$1.txt (siempre tendrás que proteger el $ en un texto de reemplazo).


Linux
  1. Cómo trabajar con usuarios y grupos en Linux

  2. ¿Cómo usar la redirección de salida en combinación con Here-documents y Cat?

  3. ¿Cómo puedo usar un cuadro de diálogo de alerta con Python en Linux?

  4. ¿Cómo usar comodines en un comando xargs?

  5. ¿Cómo puedo usar rsync con un sistema de archivos FAT?

Cómo instalar y usar la pantalla de Linux, con comandos

Cómo crear nuevos usuarios en OpenShift con htpasswd y OAuth

Cómo instalar y usar Alpine con Gmail IMAP en Linux

Cómo instalar y usar el comando Ack en Linux con ejemplos

Cómo usar una clave SSH con usuarios no root

Android:¿cómo puedo usar los comandos de shell e interactuar con el sistema Linux que se encuentra debajo?