Una delle differenze fondamentali tra Windows cmd
e le shell POSIX sono responsabili delle espansioni con caratteri jolly. Le shell eseguono tutte le espansioni richieste prima di avviare i comandi effettivi che hai richiesto. cmd
soprattutto passa i modelli di caratteri jolly ai comandi senza modifiche. (Dico principalmente, dato che penso che ci siano delle eccezioni, e le variabili d'ambiente sono espanse nella maggior parte dei casi.) Questo rende la scrittura di un rename
funzionerebbe con la stessa sintassi di cmd
abbastanza complicato.
Ma c'è un rename
per Linux - con argomenti completamente diversi, controlla la pagina man (che è un po' concisa sul mio sistema, e rename
deriva dal util-linux
pacchetto sul mio sistema, che dovrebbe essere ampiamente disponibile). La tua prima ridenominazione verrebbe eseguita in questo modo:
rename .txt .bak *.txt
Nota che la shell esegue il *
espansione, quindi rename
stesso in realtà pensa di essere stato invocato in questo modo:
rename .txt .bak file1.txt file2.txt file3.txt ...
Quindi puoi indovinare la versione del singolo file:
rename .txt .bak file1.txt
Se non vuoi usare rename
ma implementalo tu stesso, potresti creare una funzione per quello. Supponendo che tu voglia solo cambiare l'estensione del file e per rinominare un singolo file, guarda questo:
$ function chext() {
newext="$1"
file="$2"
newfile="${file%.*}$newext"
echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv
$newfile
viene creato utilizzando una rimozione di sottostringhe per eliminare l'estensione originale, quindi concatena la nuova estensione. Puoi estendere questa funzione per gestire più file in modo relativamente semplice.
Per quanto riguarda il tuo ls
domanda, usa il -d
interruttore. Ciò impedirà ls
dall'elencare il contenuto delle directory.
Demo:
$ 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
Rinomina con caratteri jolly
$ 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
Rinomina file singolo
$ 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
Il ls
predefinito
$ 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
che non ispeziona le directory
$ 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 da tenere a mente quando si tratta di caratteri jolly è che vengono espansi dalla shell. L'applicazione non sa se hai usato i caratteri jolly o se hai digitato i nomi. Ad esempio, se digiti rename *.txt *.bak
, quindi rename
command vede qualcosa come rename file1.txt file2.txt existingfile.bak
. Non sono informazioni sufficienti per andare avanti.
Mi occuperò della domanda su ls
primo, perché è più semplice. Se tutto quello che vuoi sono i nomi corrispondenti, allora non hai bisogno di ls
, perché la shell sta già eseguendo l'espansione.
echo t*
Se desideri maggiori informazioni sui file, passa il -d
opzione a ls
, per dirgli di non elencare il contenuto delle directory.
ls -ld t*
Non esiste un'utilità standard per rinominare i file, perché i primi sistemi unix non ne avevano uno. Il metodo portabile per rinominare i file utilizza un ciclo ed è un po' prolisso:
for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done
Esistono diverse utility comuni per rinominare i file, nessuna delle quali è garantita per essere installata su un dato sistema unix, ma sono tutte facili da installare. Ecco i principali:
-
rename
dalutil-linux
suite, disponibile su ogni sistema Linux non integrato (e da nessun'altra parte). Su Debian e derivati (incluso Ubuntu), questo comando si chiamarename.ul
. A condizione che non ci sia alcuna occorrenza di.txt
oltre all'estensione finale, puoi scrivererename .txt .bak *.txt
-
rename
è uno script Perl fornito da Debian e derivati come/usr/bin/rename
. Puoi rinominare i file in base a comandi Perl arbitrari.rename 's/\.txt\z/\.bak/' *.txt
-
mmv
, che può rinominare, copiare e collegare i file in base a diversi modelli basati sul nome e ha molte opzioni relative a cosa succede se esiste già un nome di destinazione. Nota che devi usare le virgolette per proteggere i caratteri jolly dall'espansione da parte della shell.mmv '*.txt' '#1.txt'
-
zmv
è una funzione zsh, disponibile se e solo se la tua shell è zsh. Può abbinare modelli zsh arbitrari (quindi puoi abbinare i nomi dei file in base a espressioni regolari arbitrarie, non solo caratteri jolly, e puoi abbinare i file in base ad altri criteri come date e dimensioni).zmv
può anche copiare e collegare.zmv '(*).txt' '$1.txt'
Se hai un certo controllo sulle macchine che usi, la mia raccomandazione è di usare zsh come shell (ha altri vantaggi rispetto a bash) e inserire queste righe nel tuo ~/.zshrc
:
autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'
noglob
è una funzione zsh che dice alla shell di non espandere i caratteri jolly nell'argomento del comando. In questo modo puoi scrivere zmv *.txt \$1.txt
(dovrai sempre proteggere il $
in un testo sostitutivo).