[英]Bash - Move files that contain certain string
我有两个文件夹: Controls
和Patients
。 在每一个里面都有几个文件夹,用于不同的个人( CO1
, CO2
),与这个组织:
Controls
└───C01
│ └───ROIS
│ └───rs_rois (imgs inside)
│ └───Cortical_masks
│ └─── accumbens
│ └─── putamen
│ └─── caudatus
│
└───C02
│ └───ROIS
│ └───rs_rois (imgs inside)
│ └───Cortical_masks
│ └─── accumbens
│ └─── putamen
│ └─── caudatus
对Patients
也是如此
我想根据名称的 ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ 将 imgs 从rs_rois
移动到Cortical_masks
文件夹。 因此,例如L_accumbens_rsfmri
文件应该 go 到accumbens
文件夹, R_caudate_rsfmri
应该 go 到caudate
文件夹。
这就是我所拥有的:
#!/bin/bash
DIR="/media/roy"; cd "$DIR/Analysis" || exit
for group in Controls Patients; do
for case in "$group"/*; do
for file in $DIR/Analysis/$case/ROIS2/rs_roi/*; do
if grep -q accumbens "$file"; then
mv $file $DIR/Analysis/$case/Cortical_masks/accumbens
elif grep -q putamen "$file"; then
mv $file $DIR/Analysis/$case/Cortical_masks/putamen
elif grep -q caudate "$file"; then
mv $file $DIR/Analysis/$case/Cortical_masks/caudate
fi
done;
done;
done;
这个脚本没有做任何事情,这是为什么呢? 如果我添加一些echo
语句,我可以看到for file
循环遍历了我的所有文件,但代码永远不会到达mv
语句。
问题是您使用的grep
表达式在文件内容而不是文件名中查找字符串( accumbens
等)。
用if [[ $file =~ accumbens ]]
之类的模式匹配替换每个grep
...
然后脚本变为:
#!/bin/bash
DIR="/media/roy"; cd "$DIR/Analysis" || exit
for group in Controls Patients; do
for case in "$group"/*; do
for file in $DIR/Analysis/$case/ROIS2/rs_roi/*; do
if [[ $file =~ accumbens ]]; then
mv $file $DIR/Analysis/$case/Cortical_masks/accumbens
elif [[ $file =~ putamen ]]; then
mv $file $DIR/Analysis/$case/Cortical_masks/putamen
elif [[ $file =~ caudate ]]; then
mv $file $DIR/Analysis/$case/Cortical_masks/caudate
fi
done;
done;
done;
使用find
。
#!/bin/bash
cd /path/to/Analysis/
for group in Control Patients; do
for case in "$group"/*; do
orig="$group/$case/ROIS/rs_rois"
dest="$group/$case/Cortica_masks"
find "$orig" -type f -name '*accumbens*' -exec mv {} "$dest" \;
find "$orig" -type f -name '*putamen*' -exec mv {} "$dest" \;
find "$orig" -type f -name '*caudate*' -exec mv {} "$dest" \;
done
done
这是一种不需要字符串比较的清晰方法。
像这样的东西会起作用吗?
制作一个包含所需字符串的 file.txt
cat file.txt
caudate
putamen
然后
while read p; do mv $p $DIR/Analysis/$case/Cortical_masks/${p} done < file.txt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.