一部の特定のフォルダを移動し、事前定義されたディレクトリ構造を維持する方法は?

一部の特定のフォルダを移動し、事前定義されたディレクトリ構造を維持する方法は?

約7,000のフォルダがあるディレクトリがあります。フォルダはzipから抽出され、一部の抽出はPythonスクリプトを使用して行われました。これらのフォルダのいくつかは次のように抽出できます。

             Main Dir
                |
         ---------------
        |               |
      fold1            fold2
        |               |
      ------         -------
    |        |          |
  .pngs   .txts       fold2
                        |
                     -------
                    |       |
                  .pngs    .txts

要件は、fold2フォルダカテゴリをデータfold1を含む同じ名前の別のフォルダではなく、データを含むフォルダと同様のディレクトリ構造に移動することです。

同様のホモ構造のすべての7kフォルダを持つようにbashまたはコマンドラインを使用してこれを行うにはどうすればよいですかfold1

ベストアンサー1

次のスクリプトは、現在の作業ディレクトリからフォームパスを検索し、a/B/B/cそれに圧縮しますa/B/ca/B/B/B/B/ca/B/ca/B/B/c/D/D/ea/B/c/D/e

このオプションとサポートされている実装をfind使用するにはGNUが必要です。-regextypeこれがない場合は、スクリプトの最後にある安全でないposixのバージョンを確認してください。mv-n

shopt -s dotglob failglob
find . -depth -regextype egrep -type d -regex '.*/([^/]*)/\1' -print0 |
while IFS= read -r -d '' path; do
  mv -n -t "$path/.." "$path"/* &&
  rmdir "$path"
done

任意のパス名(スペース、特殊文字*、改行文字まで)をサポートします。

このコマンドは以下を保証します。いいえファイルを上書きまたは削除します。左ツリーの場合は、重複したサブディレクトリを保存する必要があります。エラーメッセージが表示されますrmdir: failed to remove './A/A'。結果は右側に表示されます。

. (before)               . (after)
└── A                    └── A
    ├── someFile             ├── someFile
    ├── collision            ├── collision
    └── A                    ├── anotherFile
        ├── collision        └── A
        └── anotherFile          └── collision

隠しファイルもコピーされます。

無効なPosixバージョン

このスクリプトの移植性の高いバージョンはパス内の改行を処理できず、上記のような状況でファイルを上書きすることができ、隠しファイルを移動できません(内部に隠しファイルがある場合、サブディレクトリはそのまま残ります。 )。

find . -depth -type d | grep -E -x '.*/([^/]*)/\1' |
while IFS= read -r path; do
  mv "$path"/* "$path/.." &&
  rmdir "$path"
done

おすすめ記事