【发布时间】:2017-02-16 15:49:11
【问题描述】:
我曾尝试搜索类似的问题,但如果之前有人问过这个或类似的问题,我找不到任何如此抱歉的内容。
我正在编写一个脚本来读取带有参考编号的文件名的文本文件列表,然后查看这些文件的子文件夹,然后修改名称以包含参考编号。
文本文件将如下所示(制表符分隔并带有标题):
"File Name (without Extension)" "Media Number"
"AK7A7964" "01017134"
"IMG_0026" "01017192"
"106491 Anenome" "01017206"
"CW1_9449" "01017243"
我正在使用它来清理\t和“:”的文件
cat $file | sed "1 d" | tr "\\t" "," | sed 's/\"//g' > $cleanfile
然后将cleanfile读入while循环:
INPUT=$cleanfile
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read fname media; do
并构造要修改到文件名开头的新名称
newFileName="MA_${media}_"
然后,我使用以下方法查找具有该名称的每个文件:
for found in $(find . -type f -name "$fname.*" ); do
但是当我尝试修改名称时,如果找到多个具有相同名称的文件,它只会更改最后一个结果。
我可能错过了使用sed 执行此操作的技巧,但我找不到一个不会很快深入人心的指南!
[编辑添加]
在最后一个do 之后我在做什么是这样的:
获取路径和基本名称,创建新文件名,然后使用mv 替换它。我实际上只是在做一个echo,所以它是非破坏性的
foundPath="${found%/*}"
foundFile="${found##*/}"
newFile=$newFileName$foundFile
newFilePath="${foundPath}/${newFile}"
mv $found $newFilePath
如果任何文件名多次出现(将会出现),则只有mv'ing 最后一个。
【问题讨论】:
-
如果您在循环中包含
do之后所做的事情会很有帮助。 -
如果名称中有空格,则循环将不起作用,例如
106491 Anenome。 -
您的
while read循环如何使用,作为fname和media之间的分隔符? -
你也不需要
cat。sed "1 d" "$file" | tr "\\t" "," | sed 's/\"//g' > "$cleanfile" -
@user556068 我在
for found in $(find . -type f -name "$fname.*" ); do部分更新了之后发生的事情的详细信息