我有一个文本文件中的目录列表,我正在循环。我只想将目录的最后一部分重命名为标准化名称(这是最终转发之后目录的一部分)。有没有一种简单的方法来识别文件名的最后部分并在循环中重命名?
例如,目录是......
/data/images/projects/MM/1/scans/16/7__ep2d_fid_basic_bold_293_Resting_State
/data/images/projects/MM/1/scans/20/7__ep2d_fid_basic_bold_293_Resting_State
/data/images/projects/MM/1/scans/03/8
我想将它们改为......
/data/images/projects/MM/1/scans/16/rs
/data/images/projects/MM/1/scans/20/rs
/data/images/projects/MM/1/scans/03/rs
我无法找到一种方法来做到这一点,尽管它应该很简单。对不起,这里有个新手。
答案 0 :(得分:0)
我写了一个小脚本,可以帮你完成工作。
它将读取输入文件的内容,删除最后一个斜杠+斜杠符号后的所有内容,并在末尾追加/ rs,然后将更改写入新文件(称为output.txt)。
创建一个script.sh和chmod + x它并添加以下内容,
#!/bin/bash
# Usage: ./script.sh input.txt, where input.txt is your input file with the
# raw data you want to change.
while IFS='' read -r line
do
name=$line
echo "Before: $name"
name=`echo $name | awk -F '/' '{ for(i=1; i<=8; i++) {print $i} }' | tr '\n' '/'|sed 's/.$//'`
echo "$name/rs" >> output.txt
done < "$1"
# EOF
在控制台中输入./script.sh input.txt
来运行它。
注意:这是一种方法,它可能适合您当前的特定问题。它不会更新输入文件。相反,它使用新内容创建一个新文件(output.txt)。
答案 1 :(得分:0)
while IFS='' read -r line
do
name=$line
echo "Before: $name"
name=`echo $name | awk -F '/' '{ for(i=1; i<=10; i++) {print $i} }' | tr '\n' '/'|sed 's/.$//'`
echo "$name/rsfMRI" > /sdata/images/projects/ASD_MM/1/datafiles/output.txt
for y in $(cat /sdata/images/projects/ASD_MM/1/datafiles/output.txt); do
mv $line $y
done
done < "$1"