1

我有以下 bash 脚本,称为垃圾.sh。在我的脚本中,我向用户请求一个参数,只是一个文件名。并将文件移动到位于用户主目录中的垃圾箱文件夹中。如果该目录不存在,它只是创建一个然后将文件移到那里。另一方面,如果文件不存在,它会通知用户。

#!/bin/bash

FILE=$1
FOLDER="$HOME/Trash"
ARGS=1

if [ $# -ne $ARGS ]
then
    echo "Error: You are missing an argument!"
    echo "Usage: ./trash.sh <file_name>"
else
    if [ -s $FILE ]
    then
        if [ -d $FOLDER ]
        then
            mv -v $FILE $FOLDER
        else
            mkdir $FOLDER
            mv -v $FILE $FOLDER
        fi
    else
        echo "The file you have entered does not exist!"
    fi
fi

现在,我想以以下方式扩展我的脚本,但我不知道如何,因为我对 bash 脚本没有太多经验。首先,我想让用户输入多个参数,只需多个文件名,并移动 Trash 文件夹中的所有文件。如果一个或多个文件不存在,它将通知用户哪些文件或哪些文件不存在。简单地说,我希望我的脚本能够接收用户想要的尽可能多的参数。

例如,如果用户像这样调用脚本:

./trash.sh file1 file2 file3

假设 file2 不存在,我希望输出是。

file1 -> /home/user/Trash/file1
file3 -> /home/user/Trash/file3
file2 doesn't exist!

最后,我还希望它接受这样的参数:

./trash *.txt

简单地说,这将移动所有以 .txt 扩展名结尾的文件。如果有人可以帮助我实现这些目标/扩展我的脚本,我会很高兴。

4

1 回答 1

2
[ $# = 0 ] && { echo "Usage: $0 file [...]" >&2; exit 1; }

FOLDER="$HOME/Trash"
mkdir -p "$FOLDER" || exit 1

for file in "$@"
do
    if [ -s "$file ]
    then mv -v "$file" "$FOLDER"
    else echo "$0: $file does not exist" >&2
    fi
done

您可以检测零参数并在循环之前发出使用消息。使用"$@"对于处理包含空格等的文件名至关重要;同上 using"$file"来引用文件。如果目标目录已经存在,则使用mkdir -p不会失败;如果无法创建目录或存在具有给定名称的文件(而不是目录),它确实会失败。请注意,错误消息都包含$0; 请注意,“找不到文件”消息指定了文件名。

正如评论中所讨论的,您可以通过两个步骤来简化它:

[ $# = 0 ] && { echo "Usage: $0 file [...]" >&2; exit 1; }

FOLDER="$HOME/Trash"
mkdir -p "$FOLDER" || exit 1

for file in "$@"
do  mv -v "$file" "$FOLDER"
done

进而:

[ $# = 0 ] && { echo "Usage: $0 file [...]" >&2; exit 1; }
FOLDER="$HOME/Trash"
mkdir -p "$FOLDER" || exit 1
mv -v "$@" "$FOLDER"

请注意,如果您删除三个目录中的 makefile,则只有其中一个会在垃圾箱中。

于 2013-03-19T18:25:52.453 回答