Ich habe ein Verzeichnis users
voller Ordner, die nach den einzelnen Benutzern benannt sind. In diesen Ordnern befindet sich eine Datei namens , userinfo.csv
die ich aus dem Ordner in ziehen möchte users
. Da jede Datei im Benutzerordner userInfo heißt, möchte ich sie umbenennen, sodass sie den Benutzernamen enthält, der sich im Ordner befindet. Ich habe Folgendes versucht, aber es funktioniert nicht, da der Benutzername in $dir
das vollständige Verzeichnis ist. Ich bin nicht so sehr darauf bedacht, es in den Benutzernamen umzubenennen, ich muss es nur irgendwie umbenennen, damit users
ich beim Verschieben in nicht nur eine Datei und eine Reihe von Fehlern habe.
Wie kann ich das verbessern?
# for every subdirectory, copy userinfo.csv to /users and rename to avoid confusion/errors
for dir in /path/to/users/*/; do
(
cd "$dir" && cp userinfo.csv _$("dir").csv && cp _$("dir").csv /path/to/users/
)
done
Antwort1
Wenn Sie den Benutzernamen im endgültigen Dateinamen nicht benötigen,
for i in /path/to/users/*/userinfo.csv ; do
mv $i /path/to/users/userinfo-$RANDOM.csv
done
funktioniert das für Ihren Anwendungsfall?
Wenn nicht, können Sie auch die Parameterersetzung von Bash verwenden:
for i in /path/to/users/*/userinfo.csv ; do
mv $i /path/to/users/${i//\/-}
done
Dadurch wird alles /
durch -
in der Variable $i
(Pfad+Dateiname) ersetzt. Sie erhalten also beispielsweise:
/path/to/users/path-to-users-john-userinfo.csv
/path/to/users/path-to-users-jack-userinfo.csv
Antwort2
for i in $(ls -1 /path/to/users/); do
mv /path/to/users/$i/*/userinfo.csv /path/to/users/userinfo_$i.csv
done
Dies funktioniert, vorausgesetzt, der userinfo.csv
Speicherort ist /path/to/users/$user/userinfo.csv
. In Fällen, in denen /path/to/users/
Ordner keine userinfo.csv
oder nur Dateien enthalten sind, mv
geschieht nichts und kann daher ignoriert werden.
In $i
diesem Fall enthält es den Namen jedes Elements, /path/to/users/
sei es eine Datei oder ein Ordner.