Forループは最大サイズのファイルを見つけて別のディレクトリにコピーします。

Forループは最大サイズのファイルを見つけて別のディレクトリにコピーします。

各ディレクトリのファイルをサイズで並べ替えてから、ディレクトリ形式(下)を維持しながら、最大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

(すべての実装が-vverboseをサポートしているわけではありません。実装がそれをサポートしていない場合は置き換えてください。)cp(set -x; cp $two...)

おすすめ記事