0

创建一个 shell 脚本 (sorter.sh),该脚本循环遍历用户使用内置“read”给定的目录中的所有项目。此输入需要能够接受使用波浪号的目录。脚本必须验证输入并使用循环以仅在验证完成后允许脚本继续。它必须验证给定的目录是一个目录。

该脚本在遍历目录中的项目时,应该测试这些项目以查看它们是目录还是文件。如果它们是目录,则需要重命名它们以将当前日期添加到目录名称的末尾。如果它们是文件,则需要将它们复制到用户指定的另一个目录中,并且强制测试目的必须是路径(~/Desktop/sorted)。请注意,您不能将此目录路径硬编码到程序中,您必须使用从用户那里获取的变量。在这个其他目录中,您的脚本还必须创建以“cis90-”开头和 a 到 z 结尾的目录。所以前三个目录将是“cis90-a”、“cis90-b”、“cis90-c”。被复制的文件需要按字母顺序复制到文件夹中。所有以字母“a”开头的文件进入“cis90-a”文件夹,以字母“b”开头的文件进入“cis90-b”文件夹,以字母“c”开头的文件进入“cis90”文件夹-c”目录。为了在你到达“c”后节省一些额外的工作,所有额外的文件都应该放在“cis90-d”目录中。

我已经到了需要检查目录和文件项目的地方。不知道如何将文件放入 cis90 文件夹。这是我到目前为止所拥有的。

编辑:我现在正在研究使用 case 命令来分隔目录和文件。然后将文件复制到各自的文件夹中。

#!/bin/bash

DATE=$(date +%m%d%Y)

read -p "Enter directory for items to be sorted: " dir

eval dir=$dir

while [ -z "$dir" ]; do
        read -p "Empty entry.  Enter directory: " dir

done

while [ ! -d "$dir" ]; do

read -p "Invalid entry. Enter directory: " dir
done

read -p "Enter directory for cis90 directories: " cis

    eval cis=$cis 
        for j in $cis; do 
                mkdir $cis/cis90-{a..z}
        done

for i in $dir/*; do

        if [ -d $i ]; then 
                echo "$i is a directory."
        fi
done
4

1 回答 1

1

如果是文件,则需要提取基本文件名,然后获取文件名的第一个字母。一旦知道第一个字母是什么,就可以将其复制到相应的目录中。这可以使用“参数扩展”(键入man bash并搜索参数扩展)来完成。

例如,如果文件是foo/bar.txt,则基名是bar.txt,第一个字母是b

$ i="foo/bar.txt"
$ echo "${i##*/}"     # get the basename
bar.txt
$ i="bar.txt"
$ echo "${i:0:1}"     # get the first letter
b

这是您更新的脚本:

#!/bin/bash
DATE=$(date +%m%d%Y)

read -p "Enter directory for items to be sorted: " dir

while [ -z "$dir" ]; do
    read -p "Empty entry.  Enter directory: " dir
done

while [ ! -d "$dir" ]; do
    read -p "Invalid entry. Enter directory: " dir
done

read -p "Enter directory for cis90 directories: " cis

mkdir $cis/cis90-{a..z}

for i in $dir/*; do
    if [ -d "$i" ]; then 
        echo "$i is a directory. Moving $i to ${i}_$DATE"
        mv "$i" "${i}_$DATE"
    elif [ -f "$i" ]; then     
        filename="${i##*/}"
        firstletter="${filename:0:1}"
        echo "Copying $i to $cis/cis90-$firstletter"
        cp "$i" "$cis/cis90-$firstletter"
    fi
done

我还进行了一些更改,例如删除evals,因为我不认为它是必需的。

于 2012-12-12T10:45:33.077 回答