徐々にディレクトリの平面化とファイル名の変更 (MacOS)

徐々にディレクトリの平面化とファイル名の変更 (MacOS)

すべてのファイルの名前を変更するときは、ディレクトリ(重複するサブファイル名を含む)を平坦化したり、重複を維持したり、すべてのファイル名に増分番号を追加したりします(増分する#+名が優先されますが必須ではありません)。これを行うには、MacOSで実行する必要があります。 bashは5.0.11にアップデートされました。これは、マルチレベルプロセス(再帰解凍、重複を維持しながらマージ、pdftotxt、文字列> txtファイルのgrep)の一部ですが、数時間の検索/テスト後も不明です。

例:

Dir1
Folder A
  - file1.*
  - File2.*
Folder B
  - file1.*
  - File2.*
  - file3.*
Folder C
  - File1.*

Desired output:

Dir1
  - 1-file1.*
  - 2-File2.*
  - 3-file1.*
  - 4-File2.*
  - 5-file3.*
  - 6-File1.*

助けが必要ですか?

ベストアンサー1

2段階プロセス:

単層

から始まる

.
├── a
│   ├── file1.pdf
│   ├── file1.txt
│   ├── file2.pdf
│   └── file2.txt
└── b
    ├── file1.pdf
    └── file1.txt

1)ファイルをルート名と呼ばれるディレクトリに移動します。

├── a
│   ├── file1
│   │   ├── file1.pdf
│   │   └── file1.txt
│   └── file2
│       ├── file2.pdf
│       └── file2.txt
└─ b
    └── file1
        ├── file1.pdf
        └── file1.txt

2)インデックスを増やしてファイルの移動/名前を変更しながら、これらのサブディレクトリを繰り返します。

├── 1-file1.pdf
├── 1-file1.txt
├── 2-file2.pdf
├── 2-file2.txt
├── 3-file1.pdf
└── 3-file1.txt

コード(用bash

# To be run with your Dir1 as the top directory.

tree . 

for f in */* # iterate files in directories
do
    dir="${f%.*}"  # same with dropped extension
    mkdir -p "$dir"
    mv "$f" "$dir"
done

tree .

i=0
for d in */*/ # iterate subdirectories create above
do
    (( ++i ))
    for f in "$d"/*
    do
        mv "$f" $i-${f##*/} # drop path components and prefix with index
    done
done
rmdir */*/ */
tree .

(もちろんの呼び出しを削除することもできますtree。)

多段階

次から始めましょう:

.
├── a
│   ├── file1.pdf
│   ├── file1.txt
│   ├── file2.pdf
│   └── file2.txt
└── b
    ├── c
    │   ├── file1.pdf
    │   └── file1.txt
    ├── file1.pdf
    └── file1.txt

中間段階では、以下を提供します。

.
├── a
│   ├── file1
│   │   ├── file1.pdf
│   │   └── file1.txt
│   └── file2
│       ├── file2.pdf
│       └── file2.txt
└── b
    ├── c
    │   └── file1
    │       ├── file1.pdf
    │       └── file1.txt
    └── file1
        ├── file1.pdf
        └── file1.txt

結局、次のようになります。

├── 1-file1.pdf
├── 1-file1.txt
├── 2-file2.pdf
├── 2-file2.txt
├── 3-file1.pdf
├── 3-file1.txt
├── 4-file1.pdf
└── 4-file1.txt

完全なコード:

shopt -s extglob
shopt -s globstar
shopt -s nullglob
tree . 

dirs=( */ ) 
for f in **/*.*
do
    dir="${f%.*}"
    mkdir -p "$dir"
    mv "$f" "$dir"
done

tree .

i=0 
for d in **/
do
    files=("$d"/*.*)
    [[ ${#files[@]} -eq 0 ]] && continue
    (( ++i ))
    for f in "${files[@]}"
    do
        mv -v "$f" $i-${f##*/}
    done
done
rm -r */
tree .

このコードは、すべてのファイルの名前(拡張子)にドットがあり、ディレクトリにドットがないと仮定します。

おすすめ記事