是否可以使用 {1..10} 重命名帶有序號的文件

是否可以使用 {1..10} 重命名帶有序號的文件

我有疑問。我必須使用序號 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

相關內容