根据文件的第一个字母获取文件

时间:2012-12-12 09:33:58

标签: bash shell unix if-statement while-loop

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

脚本在迭代目录中的项目时,应测试项目以查看它们是目录还是文件。如果它们是目录,则需要重命名它们以将当前日期添加到目录名称的末尾。如果它们是文件,则需要将它们复制到用户给出的另一个目录中,并且强制测试目的必须是路径(〜/ Desktop / sorted)。请注意,您无法将此目录路径硬编码到程序中,您必须使用从用户处获取的变量。在这个其他目录中,您的脚本还必须创建以“cis90-”的开头和通过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

1 个答案:

答案 0 :(得分:0)

如果是文件,则需要提取基本文件名,然后获取文件名的第一个字母。一旦知道第一个字母是什么,就可以将其复制到相应的目录中。这可以使用"Parameter Expansion"(类型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

我也做了一些更改,例如删除eval,因为我认为不需要。

相关问题