Bash: Erstellen von Dateinamen entsprechend den Verzeichnisnamen

Bash: Erstellen von Dateinamen entsprechend den Verzeichnisnamen

Angenommen, ich habe eine Verzeichnisstruktur wieParent_dir/<name>/<date>/

Wie kann ich ein eingefügtes Bash-Skript verwenden, Parent_dirum durch jedes /<name>/<date>/Unterverzeichnis zu navigieren und eine leere Textdatei mit dem Namen <name>_<date>.txtinnerhalb /<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 touchder Zeitstempel aller vorhandenen Dateien geändert wird.

Sie können zunächst einen Probelauf durchführen, indem Sie touchFolgendes 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 iterieren

  • f=${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

verwandte Informationen