サブディレクトリから隣接するサブディレクトリにファイルをコピーする方法は?

サブディレクトリから隣接するサブディレクトリにファイルをコピーする方法は?

私の階層は MyPDB - (5rea,5res,5rez) です。ここで、各5rea、、..にはという5resディレクトリが含まれています。 etcの下の各サブディレクトリからすでに存在する別のサブディレクトリにコピーしたいと思います。何が問題なのか教えてください。 MDproduction_10ns.outproduction_10ns.outMD5rea5resanalysis5rea5res

頑張りました

$ for production_10ns.out in /scratch/srnaik/MyPDB/*/MD
 do cp production_10ns.out /scratch/srnaik/MyPDB/*/analysis/
 done

答え1

私はこれがあなたが探している階層だと思います

scratch/
└── srnaik
    └── MyPDB
        ├── 5rea
        │   ├── MD
        │   │   └── production_10ns.out
        │   └── analysis
        │       └── production_10ns.out
        ├── 5res
        │   ├── MD
        │   │   └── production_10ns.out
        │   └── analysis
        │       └── production_10ns.out
        └── 5rez
            ├── MD
            │   └── production_10ns.out
            └── analysis
                └── production_10ns.out

その場合、このスクリプトはその効果を発揮します。

#!/bin/bash

cd /scratch/srnaik/MyPDB

for i in {a..z}; do
    [ -d "5re${i}" ] && cp 5re${i}/MD/production_10ns.out 5re${i}/analysis/
done

答え2

コードには2つの問題があります。

  1. 変数には通常、ドット(ループproduction_10ns.out内の変数名として使用されますfor)を含めることはできません。
  2. 一度に複数のディレクトリにファイルをコピーすることはできませんcp。ターゲットパスとしてglobbingパターンを使用してこれを行うようです。

代わりに、すべてのファイルを繰り返してproduction_10ns.out新しい場所にコピーしてください。

for pathname in /scratch/srnaik/MyPDB/*/MD/production_10ns.out; do
    cp "$pathname" "${pathname%/*}/../analysis"
done

ここでは、各反復でファイルの絶対パス名に"$pathname"なります。production_10ns.out

拡張は${pathname%/*}パス名の末尾にある実際のファイル名を削除するので、これは$pathname拡張/scratch/srnaik/MyPDB/5rea/MD/production_10ns.outされます。${pathname%/*}/scratch/srnaik/MyPDB/5rea/MD

$( dirname "$pathname" )代わりに使用することもできます${pathname%/*}

for pathname in /scratch/srnaik/MyPDB/*/MD/production_10ns.out; do
    cp "$pathname" "$( dirname "$pathname" )/../analysis"
done

../analysis兄弟analysisディレクトリは宛先パスの終わりにあります。

ディレクトリが存在すると仮定すると、このcpコマンドはファイルをディレクトリにコピーします。

到着確実にする宛先ディレクトリが存在します。

mypdb_dir=/scratch/srnaik/MyPDB

for pathname in "$mypdb_dir"/*/MD/production_10ns.out; do
    [ ! -f "$pathname" ] && continue

    targetdir=$( dirname "$pathname" )/../analysis
    mkdir -p "$targetdir" || exit 1

    cp "$pathname" "$targetdir"
done

まだ存在しない場合はターゲットディレクトリが作成され、それ以外の場合はディレクトリの作成に失敗してシェルが終了します。

また、現在調査中のファイルが実際に存在し、最初に通常のファイルであるかどうかを明示的にテストします(テストパス-f)。繰り返しパターンが一致しない場合どのファイルは拡張されておらず、テストでこのケースをキャプチャします。

mypdb_dirコードをよりきれいにするために追加の変数が追加されました。

関連情報