
約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/c
。a/B/B/B/B/c
a/B/c
a/B/B/c/D/D/e
a/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
答え2
これが必要かどうかはわかりませんが...
mv /maindir/fold2/ /maindir/renamed/
mv /maindir/renamed/fold2/ /maindir/fold2/
次に、名前変更空でなければなりません。削除してください。
それともこれもタスクを実行する必要があります
mv maindir/fold2/fold2/{*,.*} maindir/fold2/
それから/maindir/fold2/fold2/空でなければなりません