
我有疑問。我必須使用序號 1 到 10 重命名該檔案。
touch file.$(date +%Y).$$.{1..10}
但我無法使用以下命令重命名該檔案。為什麼 {1..10} 不被接受。 mv 指令將採用 {1..10} ?
file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.
那麼下面的命令是正確的嗎?
for file in $(ls);
do
mv $file file.$(date +%Y%m).$$.{1..10}
done
答案1
大括號擴展{1..10}
將導致命令列擴展以包含多個參數。
例如,touch
命令列將擴展為類似
touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
在被處決之前。這是可以的,因為該touch
實用程式在命令列上接受任意數量的參數。注意:這將建立 10 個文件,而不是 1 個文件。
然而,與 相比,該mv
實用程式具有不同的語義touch
。它期望最後有一個或多個來源檔案/目錄和一個目標檔案/目錄。
這意味著當
mv $file $file.$(date +%Y%m).$$.{1..10}
擴展到類似的東西
mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
假設您想搬家全部文件,除了命令列上的最後一個內容。此外,它還期望命令列上的最後一個內容是目錄名稱(因為您要移動多個內容)。
我不清楚您在該循環中實際想要做什麼,因此我無法進一步評論如何解決此問題。
當談到循環本身時,請永遠不要使用ls
這樣的輸出。相反,做
for file in ./*; do
# process "$file"
done
的輸出ls
是讓你看著,由於多種原因,它不適合腳本使用。看http://unix.stackexchange.com/questions/128985/why-not-parse-ls
另外,始終用雙引號引用變數。看http://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells