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. 相反,使用findor 一个 while 循环
  • 不要ls在脚本中解析输出,而是使用glob
于 2013-05-24T21:28:33.373 回答
1

这个找到之后的部分_

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

但是由于您在 uniq 之后使用 globbing,所以我根本看不到 sed 的好处。此外,使用ls是一种非常糟糕的做法,您应该改用通配符。

如果您不介意使用 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 回答