これはおそらく単純なものですが、理解することはできません。次のディレクトリ構造があります(dir2
内部dir1
)。
/dir1
/dir2
|
--- file1
|
--- file2
file1
getとfile2
notを使用してdir1
このディレクトリ構造を「平面化」する最良の方法は何ですかdir2
?
答え1
find
GNUとGNUを使ってこれを行うことができますmv
。
find /dir1 -mindepth 2 -type f -exec mv -t /dir1 -i '{}' +
find
デフォルトでは、ディレクトリツリー全体を巡回しながら、最上位ディレクトリ()にないすべての-type f
ファイル()に対して目的のディレクトリ()に移動を-mindepth 2
実行します。引数を使用すると、ターゲットディレクトリを最初に指定できます。これは、フォーム内のすべてのソース位置をコマンドの最後に配置するために必要です。 makeは重複する項目を上書きする前に尋ねます。尋ねずに(または埋め込むか上書きせずに)上書きできます。mv
-exec mv … +
-t
mv
+
-exec
-i
mv
-f
-n
Stephane Chazelasが指摘したように、上記はGNUツールにのみ適用されます(Linuxでは標準ですが、他のほとんどのシステムには適用されません)。以下のコードは何度も呼び出されるので少し遅いですが、より一般的mv
です。
find /dir1 -mindepth 2 -type f -exec mv -i '{}' /dir1 ';'
POSIXlyは複数の引数を渡しますが、ターゲットディレクトリが最後になるように引数sh
リストを並べ替えます。mv
LC_ALL=C find /dir1 -path '/dir1/*/*' -type f -exec sh -c '
exec mv "$@" /dir1' sh {} +
答え2
zshから:
mv dir1/*/**/*(.D) dir1
**/
サブディレクトリを再帰的に移動します。これグローバル予選 .
通常のファイルのみを一致させ、D
ドットファイルを含める必要があります(名前がaで始まるファイルはデフォルトでワイルドカード一致から除外されます.
)。後で空のディレクトリをクリーンアップするには、rmdir dir1/**/*(/Dod)
--restricts /
todirectories を実行し、od
一致の深さを最初に並べ替えdir1/dir2/dir3
ますdir1/dir2
。
ファイル名の全長が非常に長い場合、コマンドラインの長さに制限が発生する可能性があります。 Zshには、この制限の影響を受けない組み込み機能があります。mv
これを有効にするには実行してください。rmdir
zmodload zsh/files
POSIXツールのみを使用してください。
find dir1 -type f -exec mv {} dir1 \;
find dir1 -depth -exec rmdir {} \;
または(各ファイルに対して別々のプロセスを実行する必要はないので、より高速です)
find dir1 -type f -exec sh -c 'mv "$@" dir1' _ {} +
find dir1 -depth -exec rmdir {} +
答え3
tarとzipの両方がディレクトリ構造をマージして削除できるため、入れ子になったディレクトリをすばやく平坦化できます。
tar -cvf all.tar *
次に、all.tar を新しい場所に移動します。
tar -xvf all.tar --strip=4
答え4
この試み:
cp /dir1/dir2/file{1,2} /another/place
file[0-9]*
または、サブディレクトリの一致するすべてのファイルに対して、次の操作を行います。
cp /dir1/dir2/file[0-9]* /another/place