Elenco degli argomenti errore troppo lungo per i comandi rm, cp, mv


629

Ho diverse centinaia di PDF in una directory in UNIX. I nomi dei PDF sono molto lunghi (circa 60 caratteri).

Quando provo a eliminare tutti i PDF insieme usando il seguente comando:

rm -f *.pdf

Ottengo il seguente errore:

/bin/rm: cannot execute [Argument list too long]

Qual è la soluzione a questo errore? Questo errore si verifica per mve cpcomandi come bene? Se sì, come risolvere questi comandi?


21
Potresti trovare utile questo link
another.anon.coward


1
Anche questo può essere rilevante http://mywiki.wooledge.org/BashFAQ/095
Lorenzo Belli

4
@jww: E ho continuato a pensare per così tanti anni che bash rientra negli "strumenti software comunemente usati dai programmatori" - una categoria le cui domande possono essere poste qui!
Vicky,

@Nik - L'aggiunta di "... in uno script" non è convincente. Quando il problema si riduce a un esempio minimo, completo e verificabile , è solo una domanda su come eseguire un comando. Mi scuso se mi manca qualcosa di ovvio.
jww

Risposte:


876

Il motivo si verifica perché bash in realtà espande l'asterisco a ogni file corrispondente, producendo una riga di comando molto lunga.

Prova questo:

find . -name "*.pdf" -print0 | xargs -0 rm

Attenzione: questa è una ricerca ricorsiva e troverà (ed eliminerà) i file anche nelle sottodirectory. Attenersi -fal comando rm solo se si è sicuri di non voler confermare.

È possibile effettuare le seguenti operazioni per rendere il comando non ricorsivo:

find . -maxdepth 1 -name "*.pdf" -print0 | xargs -0 rm

Un'altra opzione è usare la -deletebandiera di find :

find . -name "*.pdf" -delete

7
No, xargssuddivide in modo specifico l'elenco ed emette diversi comandi, se necessario.
Tripleee

7
@Dennis: -maxdepth 1deve essere il primo argomento dopo il percorso.
Barton Chittenden,

54
Find ha un -deleteflag per eliminare i file che trova, e anche se non lo fosse, sarebbe comunque considerato una pratica migliore da usare -execper eseguire rm, piuttosto che invocare xargs (che ora è 3 processi e una pipe invece di un singolo processo con -deleteo 2 processi con -exec).
scragar

3
@ ÉdouardLopez ... Ma questo sta leggendo l'input delimitato da NULL. E il tutto dangerous (broken, exploitable, etc.), è abbastanza ridicolo. Indubbiamente dovresti stare attento quando lo usi xargs, ma non è del tutto eval/evil.
Ripristina Monica, per favore, il

4
@scragar Con la -execchiamata rm, il numero di processi sarà 1 + numero di file, sebbene il numero di processi simultanei da questo possa essere 2 (forse find eseguirà processi rm contemporaneamente). Il numero di processi utilizzati xargsverrebbe ridotto drasticamente a 2 + n, dove n è un numero di processi inferiore al numero di file (ad esempio il numero di file / 10, sebbene probabilmente più a seconda della lunghezza dei percorsi). Supponendo che la cancellazione -deletevenga eseguita direttamente, l'utilizzo dovrebbe essere l'unico processo che verrebbe richiamato.
Neuralmer,

397

tl; dr

È una limitazione del kernel sulla dimensione dell'argomento della riga di comando. Utilizzare forinvece un ciclo.

Origine del problema

Questo è un problema di sistema, correlato execvee ARG_MAXcostante. C'è molta documentazione al riguardo (vedi man execve , debian's wiki ).

Fondamentalmente, l'espansione produce un comando (con i suoi parametri) che supera il ARG_MAXlimite. Sul kernel 2.6.23, il limite è stato fissato a 128 kB. Questa costante è stata aumentata e puoi ottenerne il valore eseguendo:

getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic

Soluzione: utilizzo di forLoop

Utilizzare un forloop come consigliato su BashFAQ / 095 e non vi sono limiti ad eccezione dello spazio RAM / memoria:

La corsa a secco per accertarsi che cancellerà ciò che ti aspetti:

for f in *.pdf; do echo rm "$f"; done

Ed eseguilo:

for f in *.pdf; do rm "$f"; done

Anche questo è un approccio portatile poiché glob hanno un comportamento forte e coerente tra le shell ( parte delle specifiche POSIX ).

Nota: come notato da diversi commenti, questo è effettivamente più lento ma più mantenibile in quanto può adattare scenari più complessi, ad esempio dove si vuole fare più di una sola azione.

Soluzione: utilizzo find

Se insisti, puoi usare findma in realtà non usare xargs in quanto "è pericoloso (rotto, sfruttabile, ecc.) Quando leggi input non delimitati da NUL" :

find . -maxdepth 1 -name '*.pdf' -delete 

L'utilizzo -maxdepth 1 ... -deleteinvece di -exec rm {} +consente findsemplicemente di eseguire da solo le chiamate di sistema richieste senza utilizzare un processo esterno, quindi più veloce (grazie al commento di @chepner ).

Riferimenti


31
Ottima risposta, ecco come rispondere a tutte le domande SO. Grazie!
tommed

1
+1 per menzionare il forloop. Ho usato findprima, ma cerco sempre come farlo poiché dimentico continuamente le opzioni, ecc. forsembra più facile ricordare IMHO
Robert Dundon,

3
L'ho usato come for f in *; do rm "$f"; donelavoro come un incanto
abdul qayyum

3
La find -execsoluzione sembra essere MOLTO più veloce del forloop.
tre

2
Cinque anni dopo a 4.15.0 ( 4.15.0-1019-gcpper l'esattezza) e il limite è ancora a 2097152. È interessante notare che la ricerca di ARG_MAX nel repository git di Linux dà un risultato che mostra ARG_MAX a 131702.
Matt M.

181

findha -deleteun'azione:

find . -maxdepth 1 -name '*.pdf' -delete

4
Ciò restituirà comunque "Elenco argomenti troppo lungo". Almeno per me lo fa. L'uso xargs, secondo la risposta di Dennis, funziona come previsto.
Sergio,

7
Sembra un bug da trovare.
ThiefMaster,

3
@Sergio ha avuto lo stesso problema, è stato causato dalle virgolette mancanti attorno al modello di nome.
Luxian

argh, perché uno strumento per trovare cose ha anche un interruttore per l'eliminazione? sono davvero solo io a trovare inutile dire il minimo e anche pericoloso.
matematico

2
@mathreadler Risolve il fatto che un caso d'uso comune -execè la rimozione di un mucchio di file. -exec rm {} +farebbe la stessa cosa, ma richiede comunque l'avvio di almeno un processo esterno. -deleteconsente finddi eseguire semplicemente le chiamate di sistema richieste senza utilizzare un wrapper esterno.
Chepner,

21

Un'altra risposta è forzare xargsl'elaborazione dei comandi in batch. Ad esempio ai deletefile 100alla volta, cdnella directory ed esegui questo:

echo *.pdf | xargs -n 100 rm


4
Per cancellare il comando in Linux, che può essere un disastro se sei un ingegnere e hai digitato un errore, credo che sia il "più sicuro e so cosa sta succedendo" è il migliore. Cose non fantasiose che se ti manca digitare un punto, la tua azienda si bloccherà in un minuto.
ArtificiallyIntelligence,

1
Come possiamo rendere questa espansione predefinita per determinati comandi? Ci sono molti comandi linux "standard" in cui è noto se ne hanno bisogno tutti in una volta o no (come "rm")
user1212212

1
Nota che funziona solo dove echoè incorporato un shell. Se finisci per usare il comando echo, ti imbatterai comunque nel limite degli argomenti del programma.
Toby Speight,

14

Oppure puoi provare:

find . -name '*.pdf' -exec rm -f {} \;

Ciò elimina anche i file dalle sottodirectory. Come prevenirlo?
Vicky,

@NikunjChauhan Aggiungi l'opzione -maxdepth:find . -maxdepth 1 -name '*.pdf' -exec rm -f {} \;
Jon Lin

Non riesco a inserire l'opzione maxdepth
Vicky

Quell'opzione può essere un'opzione solo Linux, come sopra la risposta di @ Dennis, sopra (la risposta selezionata).
jvriesem,

12

Se stai cercando di eliminare un numero molto elevato di file contemporaneamente (ho eliminato una directory con 485.000+ oggi), probabilmente ti imbatterai in questo errore:

/bin/rm: Argument list too long.

Il problema è che quando si digita qualcosa di simile rm -rf *, *viene sostituito con un elenco di tutti i file corrispondenti, come "rm -rf file1 file2 file3 file4" e così via. Esiste un buffer di memoria relativamente piccolo allocato per la memorizzazione di questo elenco di argomenti e se viene riempito, la shell non eseguirà il programma.

Per ovviare a questo problema, molte persone useranno il comando find per trovare ogni file e passarli uno alla volta al comando "rm" in questo modo:

find . -type f -exec rm -v {} \;

Il mio problema è che dovevo eliminare 500.000 file e impiegava troppo tempo.

Mi sono imbattuto in un modo molto più veloce di eliminare i file: il comando "trova" ha un flag "-elimina" integrato! Ecco cosa ho finito per usare:

find . -type f -delete

Usando questo metodo, stavo cancellando i file a una velocità di circa 2000 file / secondo - molto più velocemente!

Puoi anche mostrare i nomi dei file mentre li elimini:

find . -type f -print -delete

... o mostra anche quanti file verranno eliminati, quindi il tempo necessario per eliminarli:

root@devel# ls -1 | wc -l && time find . -type f -delete
100000
real    0m3.660s
user    0m0.036s
sys     0m0.552s

Grazie. Ho fatto sudo find . -type f -deleteper cancellare circa 485 mila file e ha funzionato per me. Ci sono voluti circa 20 secondi.
Nigel Alderton,

11

puoi provare questo:

for f in *.pdf
do
  rm $f
done

EDIT: il commento di ThiefMaster mi suggerisce di non rivelare una pratica così pericolosa ai jedis della giovane shell, quindi aggiungerò una versione più "più sicura" (per salvaguardare le cose quando qualcuno ha un file "-rf. ..Pdf")

echo "# Whooooo" > /tmp/dummy.sh
for f in '*.pdf'
do
   echo "rm -i $f" >> /tmp/dummy.sh
done

Dopo aver eseguito quanto sopra, basta aprire il file /tmp/dummy.sh nel tuo preferito. editare e controllare ogni singola riga per nomi di file pericolosi, commentandoli se trovati.

Quindi copia lo script dummy.sh nella directory di lavoro ed eseguilo.

Tutto questo per motivi di sicurezza.


5
Penso che questo farebbe davvero delle belle cose con un file chiamato eg-rf .. .pdf
ThiefMaster il

sì, ma generalmente quando usato in shell, l'emittente del comando "dovrebbe" dare un'occhiata a quello che sta facendo :). In realtà preferisco reindirizzare a un file e quindi ispezionare ogni singola riga.
BigMike,

2
Questo non cita "$ f". Questo è ciò di cui stava parlando ThiefMaster. -rfha la precedenza -i, quindi la tua seconda versione non è migliore (senza ispezione manuale). Ed è sostanzialmente inutile per l'eliminazione di massa, a causa della richiesta di ogni file.
Peter Cordes,

7

È possibile utilizzare un array bash:

files=(*.pdf)
for((I=0;I<${#files[@]};I+=1000)); do
    rm -f "${files[@]:I:1000}"
done

In questo modo verrà cancellato in batch di 1000 file per passaggio.


2
Per un gran numero di file questo sembra significativamente più veloce
James Tocknell,


4

Il comando rm ha una limitazione di file che è possibile rimuovere contemporaneamente.

Una possibilità è possibile rimuoverli utilizzando più volte le basi di comando rm sui modelli di file, come:

rm -f A*.pdf
rm -f B*.pdf
rm -f C*.pdf
...
rm -f *.pdf

Puoi anche rimuoverli tramite il comando find :

find . -name "*.pdf" -exec rm {} \;

3
No, rmnon ha questo limite sul numero di file che elaborerà (a parte il fatto che argcnon può essere maggiore di INT_MAX). È la limitazione del kernel sulla dimensione massima dell'intero array di argomenti (ecco perché la lunghezza dei nomi dei file è significativa).
Toby Speight,

3

Se sono nomi di file con spazi o caratteri speciali, utilizzare:

find -maxdepth 1 -name '*.pdf' -exec rm "{}" \;

Questa frase cerca tutti i file nella directory corrente (-maxdepth 1) con estensione pdf (-name '* .pdf'), quindi elimina ognuno (-exec rm "{}").

L'espressione {} sostituisce il nome del file e, "{}" imposta il nome file come stringa, inclusi spazi o caratteri speciali.


Sebbene questo frammento di codice possa risolvere la domanda, includendo una spiegazione di come e perché questo risolve il problema aiuterebbe davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo per la persona che chiede ora! Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Toby Speight,

Il punto -execè che non invochi una shell. Le citazioni qui non fanno assolutamente nulla di utile. (Impediscono l'espansione dei caratteri jolly e la divisione dei token sulla stringa nella shell in cui si digita questo comando, ma la stringa {}non contiene spazi bianchi o caratteri jolly della shell.)
tripleee

2

stavo affrontando lo stesso problema durante la copia della directory sorgente del modulo a destinazione

la directory di origine aveva file ~ 3 lakcs

ho usato cp con l'opzione -r ed ha funzionato per me

cp -r abc / def /

copierà tutti i file da abc a def senza avvertire troppo a lungo l'elenco degli argomenti


Non so perché qualcuno abbia votato in negativo, senza nemmeno commentarlo (questa è politica, gente!). Avevo bisogno di eliminare tutti i file all'interno di una cartella (la domanda non è particolare sui PDF, intendiamoci), e per questo, questo trucco sta funzionando bene, tutto ciò che bisogna fare alla fine è ricreare la cartella che è stata eliminata insieme quando Ho usato `rm -R / path / to / folder".
Thomas Tempelmann il

1
Funziona perché nel caso di OP, stava usando *, che si è espanso in un enorme elenco di .pdf, dando una directory farà sì che questo venga trattato internamente, quindi, non dovendo affrontare il problema di OP. Penso che sia stato retrocesso per questo motivo. Potrebbe non essere utilizzabile per OP se ha una directory nidificata o altri file (non pdf) nella sua directory
Alvein,

2

Prova anche questo Se vuoi cancellare file / cartelle superiori a 30/90 giorni (+) o meno di 30/90 (-) giorni, puoi usare i seguenti comandi ex

Esempio: per 90 giorni escluso sopra dopo l'eliminazione di file / cartelle di 90 giorni, significa 91,92 .... 100 giorni

find <path> -type f -mtime +90 -exec rm -rf {} \;

Esempio: per gli ultimi file di 30 giorni che desideri eliminare, utilizza il comando seguente (-)

find <path> -type f -mtime -30 -exec rm -rf {} \;

Se vuoi giz i file per più di 2 giorni

find <path> -type f -mtime +2 -exec gzip {} \;

Se vuoi vedere i file / le cartelle solo da un mese. Ex:

find <path> -type f -mtime -30 -exec ls -lrt {} \;

Oltre i 30 giorni in più solo allora elenca i file / cartelle Es:

find <path> -type f -mtime +30 -exec ls -lrt {} \;

find /opt/app/logs -type f -mtime +30 -exec ls -lrt {} \;

2

Sono sorpreso che non ci siano ulimitrisposte qui. Ogni volta che ho questo problema, finisco qui o qui . Capisco che questa soluzione ha dei limiti ma ulimit -s 65536sembra spesso fare il trucco per me.


1

Ho avuto lo stesso problema con una cartella piena di immagini temporanee che cresceva giorno dopo giorno e questo comando mi ha aiutato a cancellare la cartella

find . -name "*.png" -mtime +50 -exec rm {} \;

La differenza con gli altri comandi è il parametro mtime che prenderà solo i file più vecchi di X giorni (nell'esempio 50 giorni)

Usandolo più volte, diminuendo ad ogni esecuzione nell'intervallo di giorno, sono stato in grado di rimuovere tutti i file non necessari


1

Conosco solo un modo per aggirare questo. L'idea è di esportare quell'elenco di file pdf che hai in un file. Quindi suddividere il file in più parti. Quindi rimuovere i file pdf elencati in ogni parte.

ls | grep .pdf > list.txt
wc -l list.txt

wc -l è contare quante righe contiene list.txt. Quando hai l'idea di quanto tempo, puoi decidere di dividerlo a metà, avanti o qualcosa del genere. Uso del comando split -l Ad esempio, dividerlo in 600 righe ciascuno.

split -l 600 list.txt

questo creerà alcuni file chiamati xaa, xab, xac e così via dipende da come lo dividi. Ora per "importare" ogni elenco in quei file nel comando rm, usa questo:

rm $(<xaa)
rm $(<xab)
rm $(<xac)

Scusa per il mio cattivo inglese.


5
Se hai un file chiamato, anche pdf_format_sucks.docxquesto verrà cancellato ... ;-) Dovresti usare un'espressione regolare corretta e accurata quando cerchi i file pdf.
FooF,

1
Meglio, ma still_pdf_format_sucks.docxverrà eliminato. Il punto .di ".pdf"espressione regolare corrisponde a qualsiasi carattere. Suggerirei "[.]pdf$"invece di .pdf.
FooF,

1

Ho riscontrato questo problema alcune volte. Molte delle soluzioni eseguiranno il rmcomando per ogni singolo file che deve essere eliminato. Questo è molto inefficiente:

find . -name "*.pdf" -print0 | xargs -0 rm -rf

Ho finito per scrivere uno script Python per eliminare i file in base ai primi 4 caratteri nel nome file:

import os
filedir = '/tmp/' #The directory you wish to run rm on 
filelist = (os.listdir(filedir)) #gets listing of all files in the specified dir
newlist = [] #Makes a blank list named newlist
for i in filelist: 
    if str((i)[:4]) not in newlist: #This makes sure that the elements are unique for newlist
        newlist.append((i)[:4]) #This takes only the first 4 charcters of the folder/filename and appends it to newlist
for i in newlist:
    if 'tmp' in i:  #If statment to look for tmp in the filename/dirname
        print ('Running command rm -rf '+str(filedir)+str(i)+'* : File Count: '+str(len(os.listdir(filedir)))) #Prints the command to be run and a total file count
        os.system('rm -rf '+str(filedir)+str(i)+'*') #Actual shell command
print ('DONE')

Questo ha funzionato molto bene per me. Sono stato in grado di cancellare oltre 2 milioni di file temporanei in una cartella in circa 15 minuti. Ho commentato il tar del bit di codice in modo che chiunque abbia una conoscenza minima o nulla del pitone possa manipolare questo codice.


1

E un altro:

cd  /path/to/pdf
printf "%s\0" *.[Pp][Dd][Ff] | xargs -0 rm

printfè una shell incorporata e, per quanto ne so, è sempre stata tale. Ora dato che printfnon è un comando shell (ma un builtin), non è soggetto a " argument list too long ..." errore fatale.

Quindi possiamo tranquillamente usarlo con modelli di globbing della shell come *.[Pp][Dd][Ff], quindi convogliamo il suo output per rimuovere ( rm) il comando, attraverso xargs, che si assicura che si adatti a abbastanza nomi di file nella riga di comando in modo da non fallire il rmcomando, che è una shell comando.

La \0in printffunga da separatore nullo per i nomi di file goduto vengono poi elaborati dal xargscomando, usando ( -0) come separatore, quindi rmnon fallisce quando ci sono spazi bianchi o altri caratteri speciali nei nomi di file.


1
Sebbene questo frammento di codice possa risolvere la domanda, includendo una spiegazione di come e perché questo risolve il problema aiuterebbe davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo per la persona che chiede ora! Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Toby Speight,

In particolare, se printfnon è incorporato in una shell, sarà soggetto alla stessa limitazione.
Toby Speight,

0

Puoi creare una cartella temporanea, spostare tutti i file e le sottocartelle che desideri conservare nella cartella temporanea, quindi eliminare la vecchia cartella e rinominare la cartella temporanea nella vecchia cartella, prova questo esempio fino a quando non sei sicuro di farlo dal vivo:

mkdir testit
cd testit
mkdir big_folder tmp_folder
touch big_folder/file1.pdf
touch big_folder/file2.pdf
mv big_folder/file1,pdf tmp_folder/
rm -r big_folder
mv tmp_folder big_folder

la rm -r big_folderrimuoverà tutti i file nella big_foldernon importa quante. Devi solo fare molta attenzione prima di avere tutti i file / cartelle che vuoi conservare, in questo caso lo erafile1.pdf


0

Per eliminare tutto *.pdfin una directory/path/to/dir_with_pdf_files/

mkdir empty_dir        # Create temp empty dir

rsync -avh --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

Eliminare file specifici tramite l' rsyncuso di caratteri jolly è probabilmente la soluzione più veloce nel caso abbiate milioni di file. E si prenderà cura dell'errore che stai ricevendo.


(Passaggio opzionale): DRY RUN. Per controllare cosa verrà eliminato senza eliminare. `

rsync -avhn --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

. . .

Fai clic su suggerimenti e trucchi per rsync per ulteriori hack di rsync


0

Ho scoperto che per elenchi di file estremamente grandi (> 1e6), queste risposte erano troppo lente. Ecco una soluzione che utilizza l'elaborazione parallela in Python. Lo so, lo so, questo non è Linux ... ma nient'altro qui ha funzionato.

(Questo mi ha risparmiato ore)

# delete files
import os as os
import glob
import multiprocessing as mp

directory = r'your/directory'
os.chdir(directory)


files_names = [i for i in glob.glob('*.{}'.format('pdf'))]

# report errors from pool

def callback_error(result):
    print('error', result)

# delete file using system command
def delete_files(file_name):
     os.system('rm -rf ' + file_name)

pool = mp.Pool(12)  
# or use pool = mp.Pool(mp.cpu_count())


if __name__ == '__main__':
    for file_name in files_names:
        print(file_name)
        pool.apply_async(delete_files,[file_name], error_callback=callback_error)

0

Ho riscontrato un problema simile quando c'erano milioni di file di registro inutili creati da un'applicazione che riempiva tutti gli inode. Ho fatto ricorso a "individuare", ho ottenuto tutti i file "trova" d in un file di testo e poi li ho rimossi uno per uno. Ci è voluto un po 'ma ha fatto il lavoro!


Questo è piuttosto vago e richiede di averlo installato di locatenuovo quando c'era ancora spazio sul disco.
Tripleee

-2

Una versione un po 'più sicura rispetto all'utilizzo di xargs, anche non ricorsiva: ls -p | grep -v '/$' | grep '\.pdf$' | while read file; do rm "$file"; done

Filtrare le nostre directory qui è un po 'inutile in quanto' rm 'non lo eliminerà comunque, e può essere rimosso per semplicità, ma perché eseguire qualcosa che sicuramente restituirà errore?


3
Questo non è affatto sicuro, e non funziona con i nomi dei file con le nuove righe al loro interno, per evidenziare un ovvio caso d'angolo. L'analisils è un antipattern comune che dovrebbe assolutamente essere evitato, e aggiunge un numero di bug aggiuntivi qui. Non grep | grepè solo molto elegante.
triplo

Comunque, non è che questo sia un problema nuovo ed esotico che richiede una soluzione complessa. Le risposte findsono buone e ben documentate qui e altrove. Vedi ad esempio mywiki.wooledge.org per molto di più su questo e argomenti correlati.
tripleee,

-2

Usando GNU parallel (sudo apt install parallel ) è semplicissimo

Esegue i comandi multithread dove "{}" è l'argomento passato

Per esempio

ls /tmp/myfiles* | parallel 'rm {}'


Non lo so, ma immagino sia perché passare l'output di lsdirettamente ad altri comandi è un antipattern pericoloso - questo e il fatto che l'espansione del carattere jolly causerà lo stesso errore durante l'esecuzione lscome sperimentato nel rmcomando originale .
Toby Speight,

Per un contesto su questo, vedere ParsingLs . E parallelmette a disagio alcune persone che preferiscono evitare la complessità: se guardi sotto il cofano, è piuttosto opaco. Vedi il thread della mailing list su lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html tra Stephane (uno dei greybeard StackExchange di Unix e Linux ) e Ole Tange (autore di Parallel). xargs -Panche paralellizzato, ma lo fa in modo più semplice e più stupido con meno parti mobili, rendendo il suo comportamento molto più facile da prevedere e ragionare.
Charles Duffy,

-2

Per rimuovere i primi 100 file:

rm -rf 'ls | testa -100 '


2
Pericoloso (o lo sarebbe se si usassero i backquotes come evidentemente previsto) - se qualsiasi nome di file contiene metacaratteri della shell, inclusi gli spazi, i risultati non saranno quelli previsti.
Toby Speight,

-5

L'opzione di seguito sembra semplice a questo problema. Ho ricevuto queste informazioni da qualche altra discussione ma mi ha aiutato.

for file in /usr/op/data/Software/temp/application/openpages-storage/*; do
    cp "$file" /opt/sw/op-storage/
done

Basta eseguire il comando precedente e farà il compito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.