2017-05-03 85 views
1

我想启动一个脚本来回显(作为一个测试)在不同的目录中的文件的文件名,但得到“没有这样的文件或目录”的错误。它看起来像它追加我正在呼应的文件名的整个目录到我试图重定向到的文件名,但我该如何解决这个问题。谢谢。重定向输出没有这样的文件或目录

for filename in /data/logs/2017/jan/201701* 
do 
echo $filename > /home/bishopm/${filename%.gz} 
done 

获取每个文件下列错误试图呼应:

./data_collector.sh: line 5: /home/bishopm//data/logs/2017/jan/20170131: No such file or directory 
+0

什么是你想要的目标路径使用? '/ home/bishopm /'还是其他? – Inian

+0

你需要[在Bash中提取文件名和扩展名](http://stackoverflow.com/q/965053/1983854) – fedorqui

回答

0

实际上,你需要告诉你想通过在该目录中的文件列表进行迭代SH,所以你拨打ls命令

for filename in $(ls /data/logs/2017/jan/201701*); 
do 
file=$(basename $filename) 
echo $file > /home/bishopm/${file%.gz} 
done 

编辑:现在它应该工作,前提是bishopm目录存在 EDIT2:取代rev | cut | rev连锁basename,谢谢谢谢

+1

'sh'已经扩展了'*',所以实际上你不需要输入文件 –

+1

是的,但是生成的$ filename将具有完整路径,而不是仅仅是文件名的ls输出。另外正斜杠问题不会以这种方式发生 – PMonti

+0

它仍然执行附加操作,而不是仅重定向文件名。 – martinbshp

0

你有2 /在您的路径:/home/bishopm//...。尝试:

... 
echo $filename > "/home/bishopm${filename%.gz}" 
... 
0

更优雅的解决方案POSIX:

for filpath in /data/logs/2017/jan/201701*; do 
    filename="$(basename "${filepath}")" 
    echo "${filename}" > /home/bishopm/${filename%.gz} 
done 
相关问题