![](/img/trans.png)
[英]How to write a script for bash to archive a directory and keep its name?
[英]How to write a bash shell script which takes one argument (directory name)
如何編寫一個名為'abc'的bash shell腳本,它接受一個參數,一個目錄的名稱,並將擴展名“.xyz”添加到目錄中尚未擁有它的所有可見文件中
我大部分編寫了更改當前目錄中的文件名的代碼,但是我無法讓腳本接受參數(目錄名)並更改該目錄的文件名
#!/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”而不是模糊文件名,或者您將進入子目錄。
編輯:問題的上半部分已在下面得到解答,但第二部分要求我根據以下說明修改我自己的代碼:
修改用於創建將放入“filename”變量的循環值的命令替換。 而不只是“ls $ 1”,將輸出管道輸入“grep”。 “grep”將搜索所有不以“.xyz”結尾的文件名。 這可以通過“grep -v”選項輕松完成。 使用這種方法,你可以擺脫循環中的“echo ... | grep ...”和“if”控制結構,並簡單地進行重命名。
我將如何實現這一目標,因為根據我的理解,下面的答案只是在沒有.xyz擴展名的情況下搜索文件名,但是它沒有被接受。
你的描述在某些地方有點不清楚,所以我最明顯的是:
#!/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
第二部分的答案是:
#!/bin/bash
for file in $(ls -1 "$1" | grep -v '\.old$'); do
mv "$file" "$file.old"
done
我是從某個地方得到的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.