Probieren Sie etwas wie dies (POSIX sh):
#!/bin/sh
SOURCE_FOLDER="/home/john/folder a"
COPY_TO="/home/john/folder b"
for dir in "$SOURCE_FOLDER" "$COPY_TO"; do
if [ ! -d "$dir" ]; then
echo "Directory ${dir} does not exist." >&2
exit 1
fi
done
if [ "x`ls -A "$SOURCE_FOLDER"`" = "x" ]; then
echo "Directory '${SOURCE_FOLDER}' is empty." >&2
exit 1
fi
for file in "$SOURCE_FOLDER"/*; do
LINES=`wc -l < "$file"`
echo "File ${file} has ${LINES} lines..."
if [ "$LINES" -ge 100 ]; then
echo "Copying ${file}..."
cp -a "$file" "${COPY_TO}/"
fi
done
Hier ist eine Bash-Version für Systeme mit Bash (sagte man Unix, Linux nicht, so dass Sie wahrscheinlich die Topversion wollen):
#!/bin/bash
SOURCE_FOLDER="/home/john/folder a"
COPY_TO="/home/john/folder b"
for dir in "$SOURCE_FOLDER" "$COPY_TO"; do
if [[ ! -d "$dir" ]]; then
echo "Directory ${dir} does not exist." >&2
exit 1
fi
done
if [[ -z "$(ls -A "$SOURCE_FOLDER")" ]]; then
echo "Directory '${SOURCE_FOLDER}' is empty." >&2
exit 1
fi
for file in "$SOURCE_FOLDER"/*; do
LINES="$(wc -l < "$file"')"
echo "File ${file} has ${LINES} lines..."
if [[ "$LINES" -ge 100 ]]; then
echo "Copying ${file}..."
cp -a "$file" "${COPY_TO}/"
fi
done
ich es wie folgt getestet:
$ mkdir "folder a"
$ mkdir "folder b"
$ chmod +x script.sh
$ cd folder\ a/
$ seq 1 1000 > file1.txt
$ seq 1 1000 > file2.txt
$ seq 1 100 > file4.txt
$ seq 1 100 > file3.txt
$ seq 1 99 > file4.txt
$ seq 1 1 > file5.txt
$ seq 1 20 > file6.txt
$ cd ..
$ ./script.sh
File /.../dev/scratch/stack/folder a/file1.txt has 1000 lines...
Copying /.../dev/scratch/stack/folder a/file1.txt...
File /.../dev/scratch/stack/folder a/file2.txt has 1000 lines...
Copying /.../dev/scratch/stack/folder a/file2.txt...
File /.../dev/scratch/stack/folder a/file3.txt has 100 lines...
Copying /.../dev/scratch/stack/folder a/file3.txt...
File /.../dev/scratch/stack/folder a/file4.txt has 99 lines...
File /.../dev/scratch/stack/folder a/file5.txt has 1 lines...
File /.../dev/scratch/stack/folder a/file6.txt has 20 lines...
ich Sie ermutigen, durch diese Leitung zu Schritt durch Zeile, herauszufinden, wie jeder Teil des Skripts funktioniert, um Ihnen bei ähnlichen Aufgaben in der Zukunft zu helfen.
werde ich hier ein paar Dinge erklären:
wc -l < "$file"
uns nur die Zeilenzahl der Datei, ohne die Dateinamen gibt.
- ist wahr, wenn in der Datei mindestens 100 Zeilen vorhanden sind.
echo "..." >&2
gibt eine Zeile als Standardfehler und nicht als Standardausgabe aus.
cp -a
kopiert eine Datei unter Beibehaltung aller Attribute, z. B. Besitzer, Berechtigungen und Änderungszeit.
- Stellen Sie sicher, alle Variablen zu zitieren, es sei denn, Sie haben einen guten Grund nicht, um Probleme mit Leerzeichen zu vermeiden.
Ich nehme an, Ihre Antwort ist definitiv mehr auf den Punkt als meine :) – Will
Verlassen auf die Deklaration von numfile als eine ganze Zahl riecht schlecht. Wenn der Test beispielsweise umgekehrt wird, um Dateien mit weniger als 100 Zeilen zu kopieren, wird versucht, Verzeichnisse zu kopieren. Wahrscheinlich ist es sicherer, einfach '&&' an das Ende der Zeile anzuhängen, die die Zuweisung von numfiles ausführt, oder '' für f in * zu schreiben; tue test -f "$ f" && test "$ (wc -l <$ f)" -ge 100 && cp "$ f"/pfad; done' –
Was bedeutet [-f "$ f"]? – Jiangty