我在 Windows 7 上使用 cygwin 。我想遍历一个包含大约10,000个文件的文件夹,并对每个文件执行信号处理工具的操作。问题是文件名有一些与操作不兼容的多余字符。因此,我只需要提取文件名的某个部分。
例如,如果文件名是abc123456_justlike.txt.rna
,我需要使用abc123456_justlike.txt
。我应该如何编写循环来遍历每个文件并对缩短的文件名执行操作?
我尝试了cut - b1-10
命令,但这不允许我的工具执行必要的操作。我很感激这个问题的帮助
答案 0 :(得分:2)
尝试sed
:
echo a.b.c | sed 's/\.[^.]*$//'
s
中的sed
命令执行搜索和替换操作,在这种情况下,它替换正则表达式\.[^.]*$
(意思是:一个点,后跟任意数量的非-dots,在字符串的末尾),带有空字符串。
如果您还不熟悉正则表达式,那么学习它们是一个很好的观点。我发现使用正则表达式操作字符串要比使用cut
(或它们的等价物)之类的工具简单得多。
答案 1 :(得分:2)
使用$ {NAME%TAIL}参数替换尝试一些shell脚本:扩展变量NAME的内容,但是切断与TAIL glob模式匹配的任何后缀材料。
$ NAME=abc12345.txt.rna
$ echo ${NAME%.rna} #
# process all files in the directory, taking off their .rna suffix
$ for x in *; do signal_processing_tool ${x%.rna} ; done
如果文件名之间存在差异,您可以使用大小写对其进行分类:
for x in * ; do
case $x in
*.rna )
# do something with .rna files
;;
*.txt )
# do something else with .txt files
;;
* )
# default catch-all-else case
;;
esac
done
答案 2 :(得分:0)
如果您尝试从目录中提取文件名列表,请使用以下命令。
ls -ltr | awk -F " " '{print $9}' | cut -c1-10