繁体   English   中英

根据首个字母将文件获取到目录中

[英]Getting files based on their first letter into directories

创建一个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

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

例如,如果文件是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因为我认为这不是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM