入れ子になったディレクトリの平坦化

入れ子になったディレクトリの平坦化

これはおそらく単純なものですが、理解することはできません。次のディレクトリ構造があります(dir2内部dir1)。

/dir1
    /dir2 
       |
        --- file1
       |
        --- file2

file1getとfile2notを使用してdir1このディレクトリ構造を「平面化」する最良の方法は何ですかdir2

答え1

findGNUとGNUを使ってこれを行うことができますmv

find /dir1 -mindepth 2 -type f -exec mv -t /dir1 -i '{}' +

findデフォルトでは、ディレクトリツリー全体を巡回しながら、最上位ディレクトリ()にないすべての-type fファイル()に対して目的のディレクトリ()に移動を-mindepth 2実行します。引数を使用すると、ターゲットディレクトリを最初に指定できます。これは、フォーム内のすべてのソース位置をコマンドの最後に配置するために必要です。 makeは重複する項目を上書きする前に尋ねます。尋ねずに(または埋め込むか上書きせずに)上書きできます。mv-exec mv … +-tmv+-exec-imv-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これを有効にするには実行してください。rmdirzmodload 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

バラよりhttp://mywiki.wooledge.org/glob

関連情報