GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso utilizzare i caratteri jolly in stile ms-dos con ls e mv?

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 dal util-linux suite, disponibile su ogni sistema Linux non integrato (e da nessun'altra parte). Su Debian e derivati ​​(incluso Ubuntu), questo comando si chiama rename.ul . A condizione che non ci sia alcuna occorrenza di .txt oltre all'estensione finale, puoi scrivere

    rename .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).


Linux
  1. Come lavorare con utenti e gruppi in Linux

  2. Come utilizzare il reindirizzamento dell'output in combinazione con Here-documents e Cat?

  3. Come configurare SSH per limitare utenti/gruppi con direttive di autorizzazione e di negazione

  4. Come posso usare i comandi con alias con xargs?

  5. Come posso ordinare ls per proprietario e gruppo?

Come installare e utilizzare lo schermo Linux, con i comandi

Come creare nuovi utenti in OpenShift con htpasswd e OAuth

Come installare e utilizzare Alpine con Gmail IMAP in Linux

Come installare e utilizzare il comando Ack in Linux con esempi

Come utilizzare una chiave SSH con utenti non root

Android - Come posso utilizzare i comandi della shell e interagire con il sistema Linux sottostante?