2015-06-17 51 views
-3

我是linux和/或腳本編程的新手,請耐心等待。我想要一個可以獲取Linux目錄文件的腳本。這裏我試圖獲取文件名。如何從提到的列表中獲取文件名

for NAME in $(ls -1 *.wav /some/path | cut -d "/" -f3 | cut -d "-" -f1-5)

如果文件名中包含-IN或搬出那麼他們將SOX -mMV後到另一個目錄,但如果一些其他文件那麼它將只是mv

用於參考,文件名像

1030-04-06-2015-1433414216.wav
1030-04-06-2015-1433414318.wav
1030-04-06-2015-1433414440。 WAV
1043-21-05-2015-1432207256.wav
1043-21-05-2015-1432207457.wav
1046-20-05-2015-1432137944.wav
1046-20-05-2015- 1432138015.wav
1046-20-05-2015-1432138704.wav
1431709157.93900.0-in.wav
1431709157.93900.0-out.wav
1431709157.93900.1-in.wav
1431709157.93900.1-out.wav
1431710008.94059.0-in.wav
1431710008.94059.0-out.wav
1431710008.94059.1 -in.wav
1431710008.94059.1-out.wav
1431710008.94059.1.wav
1431710008.94059.2.wav
1431713190.94698.2-in.wav
1431713190.94698.2-out.wav
1431713190.94698.2.wav
1431721107.96010.0-in.wav
1431721107.96010.0-out.wav
1431721107.96010.1.wav

+4

你有沒有嘗試爲此寫任何東西?如果有,請告訴我們您的嘗試。 –

+0

標題說:'如何從提到的列表中獲取文件名',那裏提到的列表在哪裏?在一個文件?或者你只是想要在目錄中的每個文件?或可能與.wav擴展名?你至少應該具體明確你的要求,如果你要做的就是要求其他人的代碼...... – Jahid

+0

@EtanReisner,嘗試了幾件事情與***發現***和***切***因爲我需要*** BASENAME ***,但正如你所看到的,我已經在所有文件中都有「 - 」。 –

回答

0

下面是做到這一點的方法之一。

>cat test.sh 
#!/bin/bash 

destination="./DEST" 

# Loop over every file 
for file in "${@}" ; do 
    # If it is "-in", then sox 
    if [[ "${file}" =~ "-in" ]] || [[ "${file}" =~ "-out" ]] ; then 
    printf "sox -m ${file}; " 
    fi 
    echo "mv ${file} ${destination}" 
done 

運行時,我得到以下輸出。

>../test.sh * 
mv 1030-04-06-2015-1433414216.wav ./DEST 
mv 1030-04-06-2015-1433414318.wav ./DEST 
mv 1030-04-06-2015-1433414440.wav ./DEST 
mv 1043-21-05-2015-1432207256.wav ./DEST 
mv 1043-21-05-2015-1432207457.wav ./DEST 
mv 1046-20-05-2015-1432137944.wav ./DEST 
mv 1046-20-05-2015-1432138015.wav ./DEST 
mv 1046-20-05-2015-1432138704.wav ./DEST 
sox -m 1431709157.93900.0-in.wav; mv 1431709157.93900.0-in.wav ./DEST 
sox -m 1431709157.93900.0-out.wav; mv 1431709157.93900.0-out.wav ./DEST 
sox -m 1431709157.93900.1-in.wav; mv 1431709157.93900.1-in.wav ./DEST 
sox -m 1431709157.93900.1-out.wav; mv 1431709157.93900.1-out.wav ./DEST 
sox -m 1431710008.94059.0-in.wav; mv 1431710008.94059.0-in.wav ./DEST 
sox -m 1431710008.94059.0-out.wav; mv 1431710008.94059.0-out.wav ./DEST 
sox -m 1431710008.94059.1-in.wav; mv 1431710008.94059.1-in.wav ./DEST 
sox -m 1431710008.94059.1-out.wav; mv 1431710008.94059.1-out.wav ./DEST 
mv 1431710008.94059.1.wav ./DEST 
mv 1431710008.94059.2.wav ./DEST 
sox -m 1431713190.94698.2-in.wav; mv 1431713190.94698.2-in.wav ./DEST 
sox -m 1431713190.94698.2-out.wav; mv 1431713190.94698.2-out.wav ./DEST 
mv 1431713190.94698.2.wav ./DEST 
sox -m 1431721107.96010.0-in.wav; mv 1431721107.96010.0-in.wav ./DEST 
sox -m 1431721107.96010.0-out.wav; mv 1431721107.96010.0-out.wav ./DEST 
mv 1431721107.96010.1.wav ./DEST 
mv DEST ./DEST 

如果要執行的命令,簡單地剪切和這些行粘貼到一個殼,或修改bash腳本來執行這些命令,而不是打印出來。

+0

與您的腳本,它得到***/some/path/filename.wav ***,因爲我只想從源目錄的*** BASENAME ***。 –

0

這應該工作:

#!/bin/bash 
regex='(.*)(-out|-in)(.txt)' 
for file in *.txt;do 
# $file is the full path to the file 
    if [[ $file =~ $regex ]];then 
    #filename in this block contains -in or -out 
    filename="${file##*\/}" 
    inorout="${BASH_REMATCH[2]}" 
    extension="${BASH_REMATCH[3]}" 
    filenamewithoutextension="${filename%.*}" 
    filenamewithoutioroutorextension="${filenamewithoutextension/%$inorout/}" 
    filenamewithoutiorout="${filenamewithoutioroutorextension}$extension" 
    echo "$filename" "$inorout" "$extension" "$filenamewithoutextension" "$filenamewithoutiorout" "$filenamewithoutioroutorextension" 
    #do something here sox-m mv or whatever 
    else 
    #filename in this block doesn't contain -in or -out 
    echo "do something else" 
    fi 
done 


說明:

"${file##*\/}"是由$file即基本名(文件名)切割*/留下的字符串。

"${BASH_REMATCH[2]}"是從圖案捕獲的第二組匹配由[[ $file =~ $regex ]]-in-out

"${BASH_REMATCH[3]}"做是第三捕獲組即.wav

"${filename%.*}"是沒有.wav


資源通過削減從 $file即文件名 .*留下的字符串,你應該檢查:

  1. Bash Parameter Expansion
  2. Pattern Matching
  3. Bash Variables
+0

謝謝@Jahid。但正如你可能知道的,我想要的是,沒有*** - IN/-OUT ***的BASIC文件名,這樣我就可以混合IN/OUT和NAME輸出BASIC文件名。 –

+0

@AamirAhmed我添加了兩個其他變量:'filenamewithoutiorout'和'filenamewithoutioroutorextension' – Jahid

相關問題