在文件夹bash中创建每个子文件夹的文件列表
我在创建包含每个文件夹的任何子文件夹中的模板* .cbf的文件列表时遇到问题。在文件夹bash中创建每个子文件夹的文件列表
我在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
表示一个整数。 f
或file
可能是一个更好的选择。因此,假设您输入目录不包含空格,
for file in $input_dir/*/*/*_00001.cbf ; do
cbf=$(readlink -e $i)
(那些谁sugested 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
我改变了它,但不幸的是它还没有工作。我真的不明白原因是什么: –
'#input_dir/*/*/* _ 00001.cbf''#!/ usr/bin/env bash input_dir = $ 1 output_dir = $ 2 ;文件名为#/ level1/level2/level3/filename.ext cbf = $(readlink -e $ file) cbf_fn = $(basename $ cbf)#cbf_fn = filename.ext cbf_path = $(dirname $ cbf)#cbf_path =/1级/级别2/3级 cbf_path_p2 = $(基名$ cbf_path)#cbf_path_p2 = 3级 cbf_path_p1 = $(基名$(目录名称$ cbf_path))# cbf_path_p1 = level2的 找到'$ cbf_path'型的F -name“* .cbf“-print>'$ output_dir/files.lst' done' –
从你的第一个脚本中,我认为你的'* ._ 00001.cbf'可能是链接。这是一个正确的假设吗?以'ls -l $ input_dir/*/*/* _ 00001.cbf'的形式添加一小部分作为示例('head -5')。目标文件是否也称为“* .cbf”?除了注释之外,请尝试'echo $ cbf_path'和所有其他变量,以便您可以看到它们。他们是你期望他们是什么? –
find命令应该为你做所有这些,而不需要脚本? –
为什么不只是'find $ input_dir -type f -name“* .cbf”'? – Mat
我有很多的文件夹,我应该这样准备。有超过1000个文件夹,你可以找到超过5个子文件夹 –