Das Skript brechen wird, wenn es ein Raum oder spezielles Zeichen in mindestens einen Verzeichnisnamen ist.
Inian ist richtig über symlinks auch.
Es gibt unter einer sicheren und Standard-Lösung, bei der nur regulären Dateien durchsucht werden:
find folder/ -type f -name 'spreadsheet.csv' -printf "%p\0" | xargs -0 sh -c '
newlocdir=/new/location;
COUNTER=$(ls -1 "${newlocdir}"/spreadsheet*.csv 2>/dev/null | awk "END {print NR}") ;
for f ; do
cp -v "${f}" "${newlocdir}"/spreadsheet$COUNTER.csv;
COUNTER=$(($COUNTER+1));
done' dummyarg0
-printf "%p\0"
druckt Pfadname der mit einer zusätzlichen NULL gefundenen Dateien.
xargs -0
kann die gefundenen Dateien lesen und NULL char als Trennzeichen zwischen den Einträgen betrachten.
| awk "END {print NR}"
Gibt die Anzahl der gelesenen Zeilen aus der Pipeline aus.
COUNTER=$(ls -1 "${newlocdir}"/spreadsheet*.csv 2>/dev/null | awk "END {print NR}")
speichert die Anzahl der spreadsheet*.csv
Dateien, die bereits an der neuen Position vorhanden sind, in COUNTER-Variable.
for f ; do
liest die Positionsparameter; die Dateinamen, die von xargs
bereitgestellt werden.
sh -c ' .... ' dummyarg0
make sh
die angegebenen Befehle ausführen. dummyarg0
ist ein obligatorischer erster Parameter. sh
setzt den Wert von Spezialparameter 0 auf dummyarg0
(unbenutzt).
Der Test:
$ find folder/
folder/
folder/dir2
folder/dir2/spreadsheet.csv
folder/foo bar
folder/foo bar/spreadsheet.csv
folder/spreadsheet.csv
folder/tr"uc
folder/tr"uc/spreadsheet.csv
folder/fo'o
folder/fo'o/spreadsheet.csv
folder/dir1
folder/dir1/spreadsheet.csv
$ find folder/ -type f -name 'spreadsheet.csv' -printf "%p\0" | xargs -0 sh -c '
newlocdir=.;
COUNTER=$(ls -1 "${newlocdir}"/spreadsheet*.csv 2>/dev/null | awk "END {print NR}") ;
for f ; do
cp -v "${f}" "${newlocdir}"/spreadsheet$COUNTER.csv;
COUNTER=$(($COUNTER+1));
done' dummyarg0
`folder/dir2/spreadsheet.csv' -> `./spreadsheet0.csv'
`folder/foo bar/spreadsheet.csv' -> `./spreadsheet1.csv'
`folder/spreadsheet.csv' -> `./spreadsheet2.csv'
`folder/tr"uc/spreadsheet.csv' -> `./spreadsheet3.csv'
`folder/fo\'o/spreadsheet.csv' -> `./spreadsheet4.csv'
`folder/dir1/spreadsheet.csv' -> `./spreadsheet5.csv'
Bitte folgen Sie dem Format dieser Website. Stellen Sie das Problem in der Frage und geben Sie die Antwort unten an. – chepner
Beachten Sie, dass die Notation Bash '$ [... arithmetic ...] zugunsten von' $ ((... arithmetic ...)) veraltet ist. 'Or' ((arithmetic ...)) '- siehe [arithmetische Expansion] (https: // www.gnu.org/software/bash/manual/bash.html#Arithmetic-Expansion). Das '$ [...]' mit einzelnen eckigen Klammern ist nicht mehr dokumentiert. –