创建一个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
答案 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
,因为我认为不需要。