パスを介して一部の情報に「タグ」を付けた写真とビデオを含むディレクトリツリーがあります。私が望むのは、特定の名前のすべてのフォルダを別のフォルダに移動しますが、その名前のすべてのフォルダインスタンスへのパスを再現することです。たとえば、次のように起動します。
/Media
.../Pics
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
............./Europe
................/Italy
................/Spain
....../Home
.../Vids
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
............./Europe
................/Italy
................/Spain
....../Home
正確な名前が「ヨーロッパ」のフォルダを移動したいとしましょう。つまり、「Europe」を部分文字列として使用せず、「Europe」というフォルダとそのサブフォルダのみを移動します。望ましい結果:
/Media
.../Pics
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
....../Home
.../Vids
....../Travel
........./Round-The-World1
........./Round-The-World2
............./Japan
....../Home
/New
.../Pics
....../Travel
........./Round-The-World2
............./Europe
................/Italy
................/Spain
.../Vids
....../Travel
........./Round-The-World2
............./Europe
................/Italy
................/Spain
これは次のように似ています。特定のファイル拡張子を持つファイルを抽出し、ディレクトリ構造を保存しますか?しかし、私はLinux cliの初心者であり、組織を台無しにする危険を冒したくありません。だから助けてくれてありがとう。)
答え1
以下の回答を見る前に考慮すべきことの1つは、最初から最後までパス全体を効果的に再生成することです。/
親フォルダ構造とその内容を正確にコピーするのではなく、親フォルダ構造を再作成したいので、これはいくつかのステップのプロセスになります。構造は次のとおりです
home/
├── fol_a
│ ├── fol_ABC
│ │ └── My Folder
│ │ └── file 2
│ └── fol_XYZ
│ └── My Folder
│ ├── file1
│ └── fol_extra
│ └── file 3
└── my test
11 directories, 3 files
つまり、フルパスfile1
はです/home/fol_a/fol_XYZ/My Folder/file1
。私たちの目標は、My Folder
フォルダとその内容を移動して、my test
パスが次のようになるよう/home/my test/home/fol_a/fol_XYZ/My Folder/*
にすることです。/home/my test/home/fol_a/fol_ABC/My Folder/*
1. ディレクトリ構造を再構築し、適切なフォルダとその内容をコピーします。
同じ名前のフォルダーを持つブランチの親フォルダーで実行すると(私たちの場合はfol_a
、あなたのフォルダーにはありません/Media
)、次のことができます。
メモ:bash -c
変数を入力するにはDESTとSOURCEが必要なので、この変数をエクスポートします。find
DEST =ターゲットパスSOURCE =コピーするフォルダ名、フルパスを再生成するBRANCH =コピーする同じ名前のフォルダの公開ブランチ
export DEST="/home/my test"
export SOURCE="My Folder"
export BRANCH="/home/fol_a"
find "$BRANCH" -type d -name "$SOURCE" -exec bash -c 'mkdir -p "$DEST""$(realpath "{}")" ; cp -r "{}"/* "$DEST""$(realpath "{}")"' \;
注:次のようなメッセージが表示される場合 cp: cannot stat './[FOLDERNAME]/*': No such file or directory
**これはバグではなく、単に意味するだけです**cp -r [FOLDERNAME]/*
コマンドが空のフォルダで実行されました。
再作成されたフォルダツリーとターゲットフォルダの内容を確認してください
フォルダ構造とファイルをすばやく確認してコピーが正しいことを確認するには、次の手順を実行します。
tree "$DEST"/..
このステップ(削除前)では、フォルダーツリー全体は次のようになります。
home/
├── fol_a
│ ├── fol_ABC
│ │ └── My Folder
│ │ └── file 2
│ └── fol_XYZ
│ └── My Folder
│ ├── file1
│ └── fol_extra
│ └── file 3
└── my test
└── home
└── fol_a
├── fol_ABC
│ └── My Folder
│ └── file 2
└── fol_XYZ
└── My Folder
├── file1
└── fol_extra
└── file 3
14 directories, 6 files
2. 以前の公開ブランチからフォルダツリーを削除します。
最後に(すべてのファイルが実際に適切なフォルダなどにあることを再確認した後)、すべてが正しく表示され、実際にその内容とその内容(コピーだけでなく)を移動したい場合は、fol_d
次のコマンドを使用して実行できます。
以前に宣言された同じ公開ポイントで(上記の例では/home/fol_A
)
find "$BRANCH" -type d -name "$SOURCE" -exec rm -r "{}" \;
ノート:同様のメッセージを受け取ることができますが、これはコマンドをfind [$SOURCE] :No such file or directory
使用してコンテンツとディレクトリを削除するときにやや通常の現象です。find
-exec
最後のチェックが実行tree
され、最終出力は次のようになります。
home/
├── fol_a
│ ├── fol_ABC
│ └── fol_XYZ
└── my test
└── home
└── fol_a
├── fol_ABC
│ └── My Folder
│ └── file 2
└── fol_XYZ
└── My Folder
├── file1
└── fol_extra
└── file 3
11 directories, 3 files