2016-12-04 62 views
1

如何編寫一個名爲'abc'的bash shell腳本,它帶有一個參數,一個目錄的名稱,並將擴展名「.xyz」添加到所有目錄中的可見文件還沒有它如何編寫一個帶有一個參數(目錄名)的bash shell腳本

我主要編寫代碼,它改變當前目錄中的文件名,但我無法讓腳本接受參數(目錄名)並更改該目錄的文件名

#!/bin/bash 
case $# in 
0) echo "No directory name provided" >&2 ; exit 1;; 
1) cd "${1}" || exit $?;; 
*) echo "Too many parameters provided" >&2 ; exit 1;; 
esac 

for filename in * 
do 
echo $filename | grep "\.xyz$" 
if [ "$?" -ne "0" ] 
then mv "$filename" "$filename.old"   
fi 
done 

其他說明包括; 在'abc'內,使用「for」控制結構循環遍歷$ 1中目錄名稱中的所有非隱藏文件名 。另外,使用帶有「ls $ 1」的命令替換 而不是一個不明確的文件名,或者您將下降到子目錄中。

編輯:問題的頂部已經低於回答,但第二部分要求我按照以下說明修改自己的代碼:

修改該活動正用於創建循環值的命令替換這將被放置到「文件名」變量中。輸出爲「grep」,而不僅僅是「ls $ 1」。 「grep」將搜索所有不以「.xyz」結尾的文件名。這可以通過「grep -v」選項輕鬆完成。使用這種方法,您可以擺脫循環內部的「echo ... | grep ...」和「if」控制結構,並且只需執行重命名即可。

我該如何去實現這個目標,因爲根據我的理解,下面的答案已經只能搜索沒有.xyz擴展名的文件名,但它不被接受。

+0

這麼多事情沒有意義。什麼是第一個「if」條款?無論如何,你永遠不會使用'name'。爲什麼將'$ filename'回顯爲'/ dev/null'?它什麼也沒做。 – e0k

回答

0

你的描述中有些地方有點不清楚,所以我用了最明顯的:

#!/bin/bash 

# validate input parameters 
case $# in 
    0) echo "No directory name provided" >&2 ; exit 1;; 
    1) cd "${1}" || exit $?;; 
    *) echo "Too many parameters provided" >&2 ; exit 1;; 
esac 

shopt -s extglob # Enables extended globbing 

# Search for files that do not end with .xyz and rename them (needs extended globbing for 'not match') 
for filename in !(*.xyz) 
do 
    test -f && mv "${filename}" "${filename}.xyz" 
done 
+0

但第二部分說: 修改正在用於創建將放置在「文件名」變量中的循環值 的命令替換。 而不僅僅是「ls $ 1」,輸出到「grep」。 「grep」 將搜索所有不以「.xyz」結尾的文件名。這可以通過「grep -v」選項輕鬆地完成 。 通過這種方法,你可以擺脫回聲「| grep ...」和 「if」控制結構在循環內部,並且簡單地進行重命名。 這些說明指的是我發佈的原始代碼,所以我不確定如何修改你的程序 –

0

的回答第二個部分是這樣的:

#!/bin/bash 
for file in $(ls -1 "$1" | grep -v '\.old$'); do 
mv "$file" "$file.old" 
done 

從我得到了它某處

相關問題