簡體   English   中英

Bash - 移動包含特定字符串的文件

[英]Bash - Move files that contain certain string

我有兩個文件夾: ControlsPatients 在每一個里面都有幾個文件夾,用於不同的個人( CO1CO2 ),與這個組織:

   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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM