2012-10-03 54 views
0

该脚本正确地找到我所需要的文件,并替换连续的空格用一个空格:散后重命名文件的sed -i

find . -type f -iname *-[0-9][0-9][0-9][0-9][0-9]-* ! -iname *.gz ! -iname *_processed -print0 | xargs -0 sed -i 's/ \+//g' 

我现在需要的是一个加上_parsed到每个文件的名的末尾,以便在下次运行此脚本时忽略这些文件。

这样做的好方法是什么?注意:这些文件没有扩展名。文件名看起来像这样:

./1923/338810-99999-1923 
./1921/999999-41406-1921 
./1953/320590-99999-1953 
./1911/241360-99999-1911 
./1923/307330-99999-1923 
./1983/802220-99999-1983 

编辑:我使用的是CentOS 6.基于Python的解决方案也可以。

+0

许多接受'-i'选项的seds接受可选扩展名,所以请尝试| xargs sed -i“_parsed”'s /...//''。许多人需要删除将'-i'与扩展名分开的空格。首先在一个文件上测试它,右图: - ?祝你好运。 – shellter

回答

2

如果你正在寻找一种方式来您当前的脚本相结合,将字符串的能力,你可以把你find的结果为while循环,并在同一时间做两(while代替for支持文件用空格,如果你需要这个条件 - 感谢@TimPote的提示):

find . -type f -iname *-[0-9][0-9][0-9][0-9][0-9]-* ! -iname *.gz ! -iname *_processed -print | while read file; do \ 
    sed -i 's/ \+//g' "$file"; \ 
    mv "$file" "${file}_parsed"; \ 
done 

的替代,只是重命名,是使用find-exec选项:

find . -type f -iname *-[0-9][0-9][0-9][0-9][0-9]-* ! -iname *.gz ! -iname *_processed -exec mv {} "{}_parsed" \; 

该命令将遍历您的原始查找+替换命令找到的文件的相同列表,但是这次只会根据需要重命名它们。

+0

如果文件在路径中的任何位置都有空格,则您的第一个解决方案将会中断。我知道他说*文件看起来有某种特定的方式,但你不能太确定。一个更好的方法,使用相同的方法将是'find。 [...]同时读取文件; ''find'确保每个文件都在一个新的行上,'read'每次只读一行到变量'file'中。 –

+0

@TimPote我其实没有想到这一点 - 诚挚的谢谢你的提示;我更新了我的答案,使用'while'而不是'for'! – newfurniturey

+0

@Tim Pote如果你不担心文件名中的换行符,为什么要担心文件名中的空格? –