
Ich habe etwa 9000 Dateien in einem Verzeichnis und möchte sie in 90 Dateien in 100 Verzeichnissen nach Dateinamenreihenfolge verschieben, wobei ich alle Reste ignoriere. InMehrere Dateien von Dateiname X nach Dateiname Y kopieren?,Kalebschrieb in einemKommentar:
Wenn das Ziel nur darin besteht, sie in Stapeln zu verarbeiten, gibt es einen VIEL einfacheren Weg!
ls | xargs -iX -n20 cp X target_folder/
Ich würde cp in Stapeln von 20 Dateien ausführen, bis sie alle fertig sind.
Wie kann ich also auf der Grundlage von xargs den Zielordner wechseln, um einen neuen Ordner zu erstellen und den Befehl 100-mal auszuführen?
Antwort1
Versuchen Sie in bash
den folgenden Code:
#!/bin/bash
c=0
for f; do
if ! ((c % 100)); then
folder=folder_$(printf "%03d\n" $c)
mkdir -p $folder
fi
[[ -d "$f" ]] || mv "$f" "$folder"
((c++))
done
Führen Sie das Skript wie folgt aus:
./script.bash *
Antwort2
Dieser Befehl sieht nicht annähernd nach dem aus, was Sie versuchen. xargs
kann helfen, ist aber umständlich zu verwenden, es sei denn, Sie wissen, dass Ihre Dateinamen keine Leerzeichen oder Anführungszeichen enthalten. Hier ist eine Shell-Schleife, die Dateien in neu erstellte Unterverzeichnisse verteilt, 90 pro Verzeichnis.
set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
slice="$slice \"\${$i}\""
i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
mkdir part$i
eval "mv $slice part$i"
shift 90
done
# 0 to 89 files remain in the current directory
Antwort3
parallel
unterstützt die Ausführung mehrerer Befehle mit \;
und {#}
ist die Sequenznummer:
ls|parallel -n90 mkdir {#}\;mv {} {#}
Oder wenn die Dateinamen keine Leerzeichen, Anführungszeichen oder Backslashes enthalten:
i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)