Sto cercando di eseguire un comando simile a quello seguente in uno script bash. Dovrebbe cercare in tutte le sottocartelle di $sourcedir
e copiare tutti i file di un certo tipo al livello principale di $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
Questo sembra essere abbastanza vicino, solo che {}
non viene passato come $2
a-exec sh -c ...
Vorrei farlo il più vicino possibile al "modo giusto", con tolleranza per i caratteri speciali nei nomi dei file (in particolare i caratteri a virgoletta singola).
Modifica: vedo persone che suggeriscono l'utilizzo xargs
o l'argomentazione di argomenti. Avevo l'impressione che questo andasse bene solo per un numero limitato di argomenti. Se ad esempio ho migliaia di file .jpg che sto provando a copiare da una serie di directory della galleria in una gigantesca directory di presentazione, le soluzioni che concatenano gli argomenti continueranno a funzionare?
Modifica 2: il mio problema era che mancava una _
prima della mia prima opzione per inserire il -exec
comando. Per chiunque sia curioso di sapere come far funzionare il comando find, aggiungi il _
e tutto andrà bene:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
Ho accettato una risposta qui sotto però perché svolge lo stesso compito, ma è più efficiente ed elegante.
xargs
stato mai creato, per gestire automaticamente enormi quantità di argomenti su comandi regolari con limiti. Inoltre, la maggior parte dei limiti massimi degli argomenti è stata notevolmente migliorata per i programmi di utilità GNU standard. Vedrai anche un vantaggio in termini di prestazioni, evitando tutte quelle forcelle di processo, che su migliaia di file è rilevante.