![Bash: Erstellen von Dateinamen entsprechend den Verzeichnisnamen](https://rvso.com/image/109239/Bash%3A%20Erstellen%20von%20Dateinamen%20entsprechend%20den%20Verzeichnisnamen.png)
Angenommen, ich habe eine Verzeichnisstruktur wieParent_dir/<name>/<date>/
Wie kann ich ein eingefügtes Bash-Skript verwenden, Parent_dir
um durch jedes /<name>/<date>/
Unterverzeichnis zu navigieren und eine leere Textdatei mit dem Namen <name>_<date>.txt
innerhalb /<name>/<date>/
des Unterverzeichnisses zu erstellen?
Antwort1
Von dem Parent_dir
:
for d in */*/; do f=${d/\//_}; touch -- "$d"/"${f::-1}.txt"; done
Beachten Sie, dass dadurch touch
der Zeitstempel aller vorhandenen Dateien geändert wird.
Sie können zunächst einen Probelauf durchführen, indem Sie touch
Folgendes ersetzen echo
:
for d in */*/; do f=${d/\//_}; echo -- "$d"/"${f::-1}.txt"; done
for d in */*/
ermöglicht uns, zwei Ebenen tief durch die Verzeichnisse zu iterierenf=${d/\//_}
ersetzt das erste Verzeichnistrennzeichen/
durch_
und speichert die Ausgabe als Variablef
"$d"/"${f::-1}.txt"
wird zum Verzeichnisnamen erweitert, gefolgt vom gewünschten Dateinamen;${f::-1}
entfernt den letzten/
aus der Variablenf
Beachten Sie, dass das in redundant ist , da der Verzeichnistrenner /
mit variable vorhanden ist ; da fast alle Systeme als einzelnes akzeptieren , sollte dies kein Problem sein. Alternativ können Sie tropfen :d
/
"$d"/"${f::-1}.txt"
//
/
/
for d in */*/; do f=${d/\//_}; touch -- "${d}${f::-1}.txt"; done
Antwort2
Wenn Sie möchten, dass die Dateinamen wörtlich lauten name_date.txt
, versuchen Sie Folgendes:
#!/bin/bash
for dir in $(find . -maxdepth 2 -mindepth 2 -type d)
do
touch "$dir"/name_date.txt
done
Wenn Sie möchten, dass die Dateinamen lauten <name>_<date>.txt
, gehen Sie stattdessen wie folgt vor:
#!/bin/bash
IFS=$'\n'
for dir in $(find . -maxdepth 1 ! -path . -type d)
do
for subdir in $(find "$dir" -mindepth 1 -type d)
do
base_dir=$(basename $dir)
base_subdir=$(basename $subdir)
touch "$base_dir"/"$base_subdir"/"$base_dir"_"$base_subdir".txt
done
done
Antwort3
find . -type d -exec sh -c '
case ${1//[!\/]/} in
"//" ) f=${1:2}; f=${f/\//_}; :> "$1/$f.txt" ;;
* ) false ;;
esac
' {} {} \; -prune
for d in */*/; do
f=${d/\//_}
:> "${d%?}/${f%?}.txt"
done