2016-11-27 172 views
0

晚上好,遍歷目錄和輸出文件名到一個txt文件

我想寫一個遍歷目錄中的所有文件,如果文件相匹配的正則表達式,它輸出一個bash腳本文件名和一些額外的信息[使用貓]到一個txt文件。

該腳本將用於標記圖像集,以便稍後創建要在caffe中使用的LMDB。

這是我的嘗試;

#!/bin/bash 
for f in /absolutepath/train/* 
do 
    if [$f == '/absolutepath/train/felix.*'] 
    then $f cat ' 0' > train.txt 
    elif [$f == '/absolutepath/train/jonas.*'] 
    then $f cat ' 1' > train.txt 
    elif [$f == '/absolutepath/train/joachim.*'] 
    then $f cat ' 2' > train.txt 
    elif [$f == '/absolutepath/train/vriendinjoachim.*'] 
    then $f cat ' 3' > train.txt 
    else $f cat ' 4' > train.txt 
    fi 
echo "Done :D" 
done 

目錄看起來像這樣的文件:菲利克斯(1).JPG,菲利克斯(2).JPG,.....

如果你知道現有的腳本可以做這件事對我來說也毫不猶豫地提到這一點。

PS:這只是我的第二個職位,所以不要苛刻:)

+0

請看看:HTTP://www.shellcheck。net/ – Cyrus

回答

1

從原來的幾個變化:

  • [周圍的空間是至關重要的,因爲[是一個shell內置和/或外部命令,因此shell需要空間來劃分單詞以便找到正確的命令。
  • 使用Cyrus'正則表達式語法是查找匹配文件的一種方法;下面,我使用case語句來使用常規模式匹配。腳本中的case語法使用周圍的圓括號來分隔模式;由於(新)模式包含空格和括號,因此我使用\來逃脫它們。
  • 關於模式匹配文件名的主題​​,我已經採取了關於文件名的評論,並將其用作文件名需求的一部分;因此,名稱類似於「felix.jpg」或「felixnon-matching.jpg」的文件將落入默認值4.
  • 您的$f cat 3語法試圖將執行文件名而不是回顯它;我用printf取代了那一點。
  • 每次執行for循環時,它都會覆蓋之前的內容train.txt,所以我已將單個>更改爲>>以追加新內容。
  • 我已將echo Done語句移到了for循環之外,以便您只有在腳本完成後才能看到它(否則,您會爲每個文件都看到它)。
  • 最後要說的是,train.txt的內容再次難以解析;不知道你會怎麼做,我已經在循環中留下了兩條printf聲明;首先打印文件名,然後打印該值;另一個(註釋掉的)打印後面跟着文件名的值。我建議首先打印這個值,因爲對於每一行,首先讀取整數值,然後將其他所有內容作爲文件名「比較,而不是試圖找到文件名的後面跟一個整數。無論採用哪種方式,這些值都由選項卡\t分隔以幫助完成這些工作。

這裏是新的腳本:

#!/usr/bin/env bash 
for f in /absolutepath/train/* 
do 
    value=4 
    case "$f" in 
    (/absolutepath/train/felix\ \(*\).jpg) 
     value=0 
     ;; 
    (/absolutepath/train/jonas\ \(*\).jpg) 
     value=1 
     ;; 
    (/absolutepath/train/joachim\ \(*\).jpg) 
     value=2 
     ;; 
    (/absolutepath/train/vriendinjoachim\ \(*\).jpg) 
     value=3 
     ;; 
    (*) 
     value=4 
     ;; 
    esac 
    #printf '%d\t%s\n' "$value" "$f" >> train.txt 
    printf '%s\t%d\n' "$f" "$value" >> train.txt 
done 
echo "Done :D" 
+0

非常感謝,我學到了一些東西:) 謝謝你最後的注意事項,我還不知道caffe如何處理這些標籤文件。 我還有一些小問題; 1.我用兩個下劃線命名了一個腳本,它很長,並沒有執行[我做了chmod u + x],所以我認爲腳本的名字是有限制的? 2:是否#!/ usr/bin/env bash在每個腳本中都有要求?什麼是最常見的環境,這到底做了什麼?下劃線 – Xilef

+0

應該沒關係;你可能想編寫一個關於Unix &Linux;的問題,並參見http://unix.stackexchange.com/questions/29608/why-is-it-better-to-use-usr-bin-env-name-instead-作爲我的env問題的路徑名稱 –