各ディレクトリのファイルをサイズで並べ替えてから、ディレクトリ形式(下)を維持しながら、最大2つのファイルを別の場所にコピーするループを作成しようとしています。
folder/sample 1
.../s1.fastq.gz
.../s2.fastq.gz
.../s3.fastq.gz
.../s4.fastq.gz
folder/sample 2
.../s1.fastq.gz
.../s2.fastq.gz
.../s3.fastq.gz
.../s4.fastq.gz
私はLinuxに初めて触れて苦労しています。私は試した:
#!/bin/bash
mkdir newfolder
for dir in folder/*
do
echo $dir
ls -S $dir/*.gz | head -n +2 | cp -T newfolder
done
ただし、次のエラーが発生します。
cp: missing destination file operand after 'newfolder.'
コピー機能に大容量ファイルを正しく供給する方法は?
xargsも試してみましたが、エラーが発生しました。
xargs: invalid option -- 'w'
一度に一室ずつ正しく供給していないからです。
ベストアンサー1
zsh
シェルの場合は、以下より良い選択になりますbash
。
#! /bin/zsh -
ret=0
for dir (folder/*(/)) {
two_largest_files=($dir/*.gz(N.OL[1,2]))
if (($#two_largest_files)) {
mkdir -p newfolder/$dir:t &&
cp -v $two_largest_files newfolder/$dir:t/ || ret=$?
}
}
exit $ret
(すべての実装が-v
verboseをサポートしているわけではありません。実装がそれをサポートしていない場合は置き換えてください。)cp
(set -x; cp $two...)