[英]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.