私はLinuxが初めてなので、ここに私の非常に基本的な質問があります。 41個のフォルダーがあるディレクトリがあります。プロセスが各フォルダーに入り、すべてのファイルをコピーしてから、特定のフォルダーにすべてを貼り付けるように、ループを作成する必要があります。
これにアプローチする方法はありますか?コードソリューションなしでクリックすることはたくさんあります
画像では、アクセスする必要があるすべてのフォルダーと、すべてを貼り付ける出力フォルダーを見ることができます(zPASTE_EVERYTHING_HERE)
私のパスは:/shared/home/data/output
すべてを貼り付けたい:/shared/home/data/output/zPASTE_EVERYTHING_HERE
仮定して:
/home/gcgm/myfolders
の下にあります/tmp/output-folder
ですすべてのファイルを別のフォルダーにコピーする必要がある場合は、以下を実行できます。
mkdir /tmp/output-folder
cd /home/gcgm/myfolders
cp */* /tmp/output-folder
*/* in the this command
cp / target`の意味:
例に基づいて、すべてのソースディレクトリに含まれているのに対し、宛先ディレクトリには数字が含まれていません。したがって、親ディレクトリから以下のように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"/*' _ {} \;