Sto cercando di eseguire un comando simile a quello seguente in uno script bash. Dovrebbe cercare in tutte le sottocartelle di $sourcedire 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 $2a-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 xargso 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 -execcomando. 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.
xargsstato 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.