0

"_"の前に一意のファイル名を取得し、それらのファイルのみをコピーしようとしています。以下はスクリプトですが、sed

私のファイル名の例 - P2.D2.C00_21、P2.D2.C00_22

#!/bin/bash   

echo "Step 1"
names=$(ls ./Folder1 | sed 's//.*_//' | uniq)

echo "Step 2"    
for name in `echo $names`
do
    echo "Step 3"
    files=($(ls -v ./Folder1/${name}.* | xargs -n1 basename))
    echo "step 4"
    cp -f ./Folder1/${files[${#files[@]} - 1]} ./folder2
    echo "step 5"
done
4

2 に答える 2

1

あなたは間違った方法を取っています:

  • のバグを防ぐために、for ループを使用してファイルを反復処理しないでword splitingください。代わりに、findまたは while ループを使用します
  • lsスクリプトで出力を解析せず、代わりにグロブを使用してください
于 2013-05-24T21:28:33.373 に答える
1

This one finds the part after _:

 sed 's//.*_// # should be 's/_.*//'

but since you are globbing after uniq, I don't see the benefit of sed at all. Also, using ls is a very bad practice, you should rely in globbing instead.

If you don't mind using Perl:

for (glob("Folder1/*")) {
    ($a,$b,$c)=/((.*)_(.*))/;
    push @{$h{$b}}, $c; 
}
for $b(keys %h) {
    system("cp '${b}_$h{$b}[-1]' folder2/");
}
于 2013-05-24T21:32:46.993 に答える