无法将文件安排到目录中

问题描述 投票:2回答:3

我试图将名为f ##。txt(#being a digit 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

我无法弄清楚我哪里出错了。

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

linux bash
3个回答
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

1
投票

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

希望这可以帮助。


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上,你可以用homebrew安装它:

brew install rename
© www.soinside.com 2019 - 2024. All rights reserved.