无法将文件排列到目录中

时间:2018-10-31 14:58:52

标签: linux bash

我正在尝试将名称为f ##。txt(#为0-9的数字)的文本文件组织到目录中,使它们最终以d#/ f#.txt结尾。

#! /bin/bash                                                                                                                                                                                                

for i in {0..9} ;
do
    mkdir -p "$1/d$i "
    for j in {0..9};
    do
    FILE= "/$1/f$i$j.txt"
        if [ -f FILE ];
        then
            echo 'Moving!'
            mv "/$1/f$i$j.txt" "/$1/d$i/f$j.txt"
        fi
    done
done

上面的代码是我到目前为止所拥有的,但是我不断收到错误消息:

CO1101/OSN2/q4-arrange.sh: line 8: /test/f00.txt: No such file or directory

我不知道哪里出了问题。

测试目录位于当前工作目录内

3 个答案:

答案 0 :(得分:1)

似乎您在FILE =和“ /$1/f$i$j.txt”之间有一个空格。尝试删除空间,然后看看会发生什么。 Bash不喜欢变量分配中的空格(即等号周围)。

希望这会有所帮助。

答案 1 :(得分:0)

您可以尝试这样的事情:

#!/usr/bin/env bash

pref=f ext=txt
for f in "$pref"[0-9][0-9]."$ext"; do
    num=${f#"$pref"} num=${num%."$ext"}
    dir=d${num%?} file=$pref${num#?}.$ext

    [[ -d $dir ]] || mkdir -- "$dir" || exit 1
    mv -- "$f" "$dir/$file"
done

试运行:

$ tree
.
├── f11.txt
├── f14.txt
├── f28.txt
├── f30.txt
└── script
$ ./script
$ tree
.
├── d1
│   ├── f1.txt
│   └── f4.txt
├── d2
│   └── f8.txt
├── d3
│   └── f0.txt
└── script

答案 2 :(得分:0)

如果您拥有rename实用程序-也称为 Perl重命名,则可以使用以下相当简洁的命令:

rename --dry-run -p 's|f([0-9])([0-9])|d$1/f$2|' *txt

示例输出

'f11.txt' would be renamed to 'd1/f1.txt'
'f14.txt' would be renamed to 'd1/f4.txt'
'f28.txt' would be renamed to 'd2/f8.txt'
'f30.txt' would be renamed to 'd3/f0.txt'

有关如何在各种发行版中调用该软件包的信息,请参见评论 here


如果任何人都在 macOS 上,则可以使用以下命令通过自制软件安装它:

brew install rename