有没有一种方法可以让我的脚本根据名称将文件放入目录中,但是只有当多个文件具有相同的前缀时才可以?

时间:2018-12-27 06:25:34

标签: bash sh

我正在尝试让脚本将文件的前几个字母组织到自动创建的目录中。我的问题是我想跳过为单个文件创建目录

我在这里找到了一个命令,可以很轻松地完成我想要的操作。如果我运行它,我将把文件放置在按字母顺序排列的文件夹,A,B等中。在进行此操作后,我研究了unix的“ cut”命令,并将代码更改为.sh脚本。现在它可以工作了,它将使文件夹成为文件名的前四个字母(我想为每个客户提供一个文件夹,这样我以后就可以轻松地对其进行重命名)。

我恐怕要运行它。我不想最后得到一堆奇怪的文件夹,每个文件夹只包含一个文件。这似乎也很容易。我喜欢学习,并且可以使用我的Linux Shell脚本编写圣经。

我如何使我的脚本像现在一样将文件排序到目录中,但是不让它仅包含一个文件的目录?

就像我有以下七个文件一样:

robert01.cdr
robert02.cdr
mom01.cdr
mom02.cdr
mom03.cdr
father.cdr
sister.cdr 

我想让罗伯特和妈妈们在各自的目录中,但是我希望单身父亲和单身姐妹保持不展开,即:

[robe]
[mom0]
father.cdr
sister.cdr

我是新手,这是我第一次使用此网站。我不是懒惰地找人为我做这个,我只是有点迷路。如果有人可以提供指向我可以从中学习的样本的链接,或者至少将我指向可能要研究的命令,那就是我想要的。我在这里学习(:

我们有一家小型标牌业务,在几台不同的计算机上的约50个不同的文件夹中,有数千个无序的coreldraw文件。我正在努力消除多年来在学习过程中组织不良的情况

for R in *.cdr; do
    name=`echo "$R"|sed 's/ -.*//'`
    letter=`echo "$name"|cut -c1-4`
    dir="rawr/$letter/$name"
    mkdir -p "$dir"
    mv "$R" "$dir"
done

1 个答案:

答案 0 :(得分:1)

从评论开始,继续使用@tripleee发布的新块,您只需使用bash内置参数扩展 string索引即可大大提高脚本的效率。返回每个文件名的前4个字符,然后使用简单的辅助函数计算与用作glob的前4个字符匹配的文件名的出现次数,例如

#!/bin/bash

count_args() {
    echo $#
}

for R in *.cdr; do
    if [ $(count_args "${R:0:4}"*) -gt 1 ]; then
        mkdir -p "${R:0:4}" && mv "$R" "${R:0:4}"
    fi
done

这完全消除了将echo的输出管道传输到sed,然后再将echo的输出管道传输到cut(您要避免在循环中调用外部实用程序)在最大程度上防止每次迭代产生多个子shell)

在这种情况下,使用输入的文件名和上面的脚本,您可以根据需要整理目录,例如

目录之前的示例

$ ls -l
total 0
-rw-r--r-- 1 david david   0 Dec 27 00:53 father.cdr
-rw-r--r-- 1 david david   0 Dec 27 00:53 mom01.cdr
-rw-r--r-- 1 david david   0 Dec 27 00:53 mom02.cdr
-rw-r--r-- 1 david david   0 Dec 27 00:53 mom03.cdr
-rw-r--r-- 1 david david   0 Dec 27 00:53 robert01.cdr
-rw-r--r-- 1 david david   0 Dec 27 00:53 robert02.cdr
-rw-r--r-- 1 david david   0 Dec 27 00:53 sister.cdr

示例“使用/目录后”

$ ../moveprefix.sh

$ ls -l
total 0
drwxr-xr-x 2 david david 100 Dec 27 01:09 mom0
drwxr-xr-x 2 david david  80 Dec 27 01:09 robe
-rw-r--r-- 1 david david   0 Dec 27 00:53 father.cdr
-rw-r--r-- 1 david david   0 Dec 27 00:53 sister.cdr

$ ls -al mom0
-rw-r--r-- 1 david david 0 Dec 27 00:53 mom01.cdr
-rw-r--r-- 1 david david 0 Dec 27 00:53 mom02.cdr
-rw-r--r-- 1 david david 0 Dec 27 00:53 mom03.cdr

注意:该脚本被放置在当前目录的上一级以避免脚本文件名。没有什么可以阻止在当前shell中定义count_args函数,然后将其放入完全不使用单独的脚本文件就可以做到这一点

仔细检查一下,如果还有其他问题,请告诉我。