web-dev-qa-db-ja.com

ループコードのコピー/貼り付け

私はLinuxが初めてなので、ここに私の非常に基本的な質問があります。 41個のフォルダーがあるディレクトリがあります。プロセスが各フォルダーに入り、すべてのファイルをコピーしてから、特定のフォルダーにすべてを貼り付けるように、ループを作成する必要があります。

これにアプローチする方法はありますか?コードソリューションなしでクリックすることはたくさんあります

画像では、アクセスする必要があるすべてのフォルダーと、すべてを貼り付ける出力フォルダーを見ることができます(zPASTE_EVERYTHING_HERE)

Directory

私のパスは:/shared/home/data/output

すべてを貼り付けたい:/shared/home/data/output/zPASTE_EVERYTHING_HERE

4
GCGM

仮定して:

  • コピーするフォルダーとそのファイルは/home/gcgm/myfoldersの下にあります
  • 出力フォルダーは/tmp/output-folderです

すべてのファイルを別のフォルダーにコピーする必要がある場合は、以下を実行できます。

mkdir /tmp/output-folder
cd /home/gcgm/myfolders
cp */* /tmp/output-folder

*/* in the this commandcp / target`の意味:

  • 現在のディレクトリの下のすべてのディレクトリ(最初の*)にあるすべてのファイル(2番目の*)を取得します。
5
Yaron

例に基づいて、すべてのソースディレクトリに含まれているのに対し、宛先ディレクトリには数字が含まれていません。したがって、親ディレクトリから以下のようにcpの(GNU)bashを使用できます。

shopt -s dotglob  #Enables matching hidden files with glob patterns
shopt -s globstar #Enables recursive traverse of directories
cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/*
  • cpはコピーを行います
  • -t zPASTE_EVERYTHING_HEREは宛先ディレクトリを設定します
  • *[[:digit:]]*/**/*は、少なくとも1桁の数字を含むディレクトリに一致し、それらを(任意の深さで)走査してすべてを取得します。

サブシェルですべてを実行して、親シェルをそのまま保持します。親ディレクトリから:

( shopt -s dotglob && shopt -s globstar && \
    cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/* )

次に、任意の宛先ディレクトリ名について、ディレクトリをGLOBIGNORE変数として設定します。

GLOBIGNORE=whatever_destination

これで、次のことが簡単にできます。

cp -t whatever_destination */**/*

または、extglobを活用できます。

shopt -s extglob #Should be already set on any interactive Shell session
cp -t whatever_destination !(whatever_destination)/**/*

付記:

ソースディレクトリ内に多くのファイル/ディレクトリがある場合、ARG_MAXがトリガーされる可能性があります。その場合、次の2つのオプションがあります。

  • for構造を使用して、ファイルを1つずつ反復処理します。想像できるように、これは非常に遅くなります。

    for f in !(whatever_destination)/**/*; do cp -- "$f" whatever_destination/; done
    
  • findを使用します。

    find . -mindepth 1 -maxdepth 1 -type d -not -name whatever_destination \
        -name '*' -exec sh -c 'cp -rt whatever_destination "$1"/*' _ {} \;
    
6
heemayl