私の階層は MyPDB - (5rea,5res,5rez) です。ここで、各5rea
、、..にはという5res
ディレクトリが含まれています。 etcの下の各サブディレクトリからすでに存在する別のサブディレクトリにコピーしたいと思います。何が問題なのか教えてください。 MD
production_10ns.out
production_10ns.out
MD
5rea
5res
analysis
5rea
5res
頑張りました
$ 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つの問題があります。
- 変数には通常、ドット(ループ
production_10ns.out
内の変数名として使用されますfor
)を含めることはできません。 - 一度に複数のディレクトリにファイルをコピーすることはできません
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
コードをよりきれいにするために追加の変数が追加されました。