2015-04-08 60 views
0

我正在寫一個bash腳本,應該按照它們的名稱部分將照片分類到文件夾。 這個問題給了我很多錯誤,我找不到這個錯誤。即使殼牌檢查沒有發現,所以如果你們能幫助我,這將是偉大的。Bash腳本不會使文件夾,並嘗試將其自我移動

我的腳本:

#!/bin/bash 

Total=$(ls -1 | wc -l) 
echo "$Total" 
Count=1 

while [[ $Count < $Total ]] 
do 
    NameOut=$(ls -1 | grep -o '[^-]*,[^-]*' | sed -n "$Count"p) 
    echo "$NameOut" 
    Filename=$(ls -1 | sed -n "$Count"p) 
    echo "$Filename" 
    if [ -d "$NameOut" ]; then 
     mv "$Filename" "$NameOut"/ 
     Count=$((Count + 1)) 
    else 
     mkdir "$NameOut" 
     mv "$Filename" "$NameOut"/ 
     Count=$((Count + 1)) 
    fi 
done 

腳本嘗試由於某種原因移動腳本本身並沒有使文件夾 - 因爲沒有文件夾移動它們無法移動的文件至。 目錄它自身包含了看起來像這樣的文件:

ls -1 

REZ-Name,Surname-02-12-1996.jpg 
BLEACH-Name,Surname-04-08-2008.jpg 
+1

我把你的編輯回滾了,因爲**基本上**改變了你所問的問題,這不是這個網站的工作原理。如果給出的解決方案解決了你問的問題,那麼你接受它併爲新問題提出一個新問題。 –

回答

1

shellcheck的確指出了幾個問題,這個腳本。

該腳本的效率非常低,因爲它不需要這樣做時會反覆遍歷文件內容。

一組文件名將是很多更好的方式來完成這項任務。

這就是說沒有任何與您列出的錯誤有關。

您的腳本的問題是print行。

你期待他們在做什麼?

echo行已打印出您的變量值。那你的意思是printf '%s\n' "$var"? (這將只是複製echo行輸出?)

print是一個完全不同的命令,並試圖找出如何打印您給它的參數(如打印機等)。


未經測試,但類似這樣的事情可能會做你想做的。 grep的剩餘使用幾乎肯定可以被替換,但是沒有看到有代表性的輸入和輸出,這個偏離初始意向的可能性就不大可能。

#!/bin/bash 

files=(*) 
total=${#files[@]} 
echo "$total" 

count=1 
while ((count < total)); do 
    filename=${files[count - 1]} 
    echo "$filename" 
    nameout=$(echo "$filename" | grep -o '[^ ]*,[^ ]*') 
    mkdir -p "$nameout" 
    mv "$filename" "$nameout/" 
    count=$((count + 1)) 
done 
+0

只是爲了調試,所以我知道變量中存儲了什麼 – Nroh

+0

'echo'行正在爲您做這件事。 'print'行不正確。也許你的意思是'printf'? –

+1

另外,@Nroh使用'>> Names.txt'是衆所周知的shell反模式,每次他運行腳本來測試它時,都會建立一個更大更大的文件。請注意,'print'在'ksh'中的工作方式與'printf'和'echo'類似,但在'bash'(它試圖將文件發送到打印機)時不能用於調試目的。祝你們好運。 – shellter

相關問題