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
delutil-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 llamarename.ul
. Siempre que no se produzca.txt
aparte de la extensión final, puede escribirrename .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).