linux - 创建文件夹 bash 中每个子文件夹的文件列表

标签 linux bash shell

我在使用模板 *.cbf 在每个文件夹的任何子文件夹中创建文件列表时遇到问题。

我在 Shell 中编写了脚本。但它总是以“没有这样的文件或目录”退出。

路径结构如下/dir///*.cbf

#!/usr/bin/env bash
input_dir=$1 
for i in `ls $input_dir/*/*/*_00001.cbf`; do 
    cbf=$(readlink -e $i)
    cbf_fn=$(basename $cbf)
    cbf_path=$(dirname $cbf)
    cbf_path_p2=$(basename $cbf_path)
    cbf_path_p1=$(basename $(dirname $cbf_path))
    find `$input_dir/$cbf_path_p1/$cbf_path_p2` -name "*.cbf" -print > files.lst
done

最佳答案

主要原因是该目录可能不存在。我将检查您的代码:

假设您的input_dir/hoppa 并且您的链接是/hoppa/1/2/a_00001.cbf/hoppa/1/2/a_00001.cbf 是指向 /level1/level2/level3/filename.ext

的链接
for i in `ls $input_dir/*/*/*_00001.cbf`; do 

处理 ls 的输出通常不是一个好主意。此外,对于那些曾经使用 Fortran(打洞卡,啊那些日子......)的人来说,i 建议使用整数。 ffile 可能是更好的选择。因此,假设您的输入目录不包含空格,

for file in $input_dir/*/*/*_00001.cbf ; do
    cbf=$(readlink -e $i)

(那些建议 find 的人可能错过了 readlink)

    cbf_fn=$(basename $cbf)      # cbf_fn=filename.ext
    cbf_path=$(dirname $cbf)     # cbf_path=/level1/level2/level3
    cbf_path_p2=$(basename $cbf_path)
                                 # cbf_path_p2=level3
    cbf_path_p1=$(basename $(dirname $cbf_path))
                                 # cbf_path_p1=level2
    find `$input_dir/$cbf_path_p1/$cbf_path_p2` -name "*.cbf" -print > files.lst

因此查找将查找 /hoppa/level2/level3,一个可能不存在的目录。

done   

关于linux - 创建文件夹 bash 中每个子文件夹的文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45352231/

相关文章:

linux - 写一个shell脚本,在连接丢失时保持重新连接SSH for proxy

linux - 如何根据行字段为每一行添加前缀

linux - 检查进程是否正在运行的脚本,如果没有运行则执行代码行

android - Linux 互斥体必须是全局的?

linux - 进程超过 RedHat Enterprise Linux 6 上的线程堆栈大小限制?

bash - Bash-从循环中获取基本名称

bash - 向父 bash 报告孙子进程 ID

linux - 如何以自动方式搜索、替换特定的十六进制代码

linux - 如何将参数传递给 sh 从 stdin 读取的脚本?

python - 如何开始在 Linux 主机上使用 python