Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 循环过滤查找并执行操作_Bash_Terminal_Pandoc - Fatal编程技术网

Bash 循环过滤查找并执行操作

Bash 循环过滤查找并执行操作,bash,terminal,pandoc,Bash,Terminal,Pandoc,我有一堆Wordpress文件的垃圾堆,我正试图将它们全部转换成降价 我写的剧本是: htmlDocs=($(find . -print | grep -i '.*[.]html')) for html in "${htmlDocs[@]}" do P_MD=${html}.markdown echo "${html} \> ${P_MD}" pandoc --ignor

我有一堆Wordpress文件的垃圾堆,我正试图将它们全部转换成降价

我写的剧本是:

htmlDocs=($(find . -print | grep -i '.*[.]html'))
for html in "${htmlDocs[@]}"
            do
                P_MD=${html}.markdown
                echo "${html} \> ${P_MD}"
                pandoc --ignore-args -r html -w markdown < "${html}" | awk 'NR > 130' | sed '/<div class="site-info">/,$d'  > "${P_MD}"                
            done
o_0


帮助?

尝试添加bash shebang并设置IFS以处理文件夹和文件名中的空格:

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

htmlDocs=($(find . -print | grep -i '.*[.]html'))
for html in "${htmlDocs[@]}"
do
                P_MD=${html}.markdown
                echo "${html} \> ${P_MD}"
                pandoc --ignore-args -r html -w markdown < "${html}" | awk 'NR > 130' | sed '/<div class="site-info">/,$d'  > "${P_MD}" 
done
IFS=$SAVEIFS
#/bin/bash
SAVEIFS=$IFS
IFS=$(echo-en“\n\b”)
htmlDocs=($(find.-print | grep-i.*[.]html'))
对于“${htmlDocs[@]}”中的html
做
P_MD=${html}.markdown
echo“${html}\>${P_MD}”
pandoc--忽略args-r html-w标记<“${html}”| awk'NR>130'| sed'/,$d'>“${P_MD}”
完成
IFS=$SAVEIFS

脚本失败的原因可能有很多,因为您创建数组的方式不正确:

htmlDocs=($(find . -print | grep -i '.*[.]html'))
数组的形式为:
NAME=(VALUE1 VALUE2…
,其中
NAME
是变量的名称,
VALUE1
VALUE2
,其余的字段与存在于
$IFS
(输入字段分隔符)变量中的字符分隔。假设您找到一个带有空格的文件名。然后表达式将在数组中创建单独的项

另一个问题是,表达式不处理globbing,即基于特殊字符的shell扩展生成文件名,例如
*

mkdir dir.html
touch \ *.html
touch a\ b\ c.html

a=($(find . -print | grep -i '.*[.]html'))
for html in "${a[@]}"; do echo ">>>${html}<<<"; done
输出

查找选项

find
命令选择所有类型的节点,包括目录。您应该使用
-type
选项,例如文件的
-type f

如果要使用正则表达式筛选结果集,请使用
-regex
选项或
-iregex
进行不区分大小写的匹配:

mapfile -t a < <(find . -type f -iregex .*\.html$)
for html in "${a[@]}"; do echo ">>>${html}<<<"; done
替代方法

但是,我更愿意使用
read

find . -type f -iregex .*\.html$ | while read line
do
  printf '>>>%s<<<\n' "$line"
done
find-在读取行时键入f-iregex.*\.html$
做

printf'>>>%bash文件根目录下是否有html文件?尝试运行
find-在同一个目录下打印| grep-i'.*[.]html'
。管道运行良好。显然,我不得不重新保存该文件(我想第一个文件有点损坏???),因为最初您的答案都不起作用,但确实如此:很明显,我是Bash新手——我通常的答案是“制作Python脚本”,但我想以本机方式完成这项工作。
# Disable globbing, remember current -f flag value
[[ "$-" == *f* ]] || globbing_disabled=1
set -f

IFS=$'\n' a=($(find . -print | grep -i '.*[.]html'))
for html in "${a[@]}"; do echo ">>>${html}<<<"; done

# Restore globbing
test -n "$globbing_disabled" && set +f
>>>./  .html<<<
>>>./a b c.html<<<
>>>./ *.html<<<
>>>./dir.html<<<
mapfile -t a < <(find . -print | grep -i '.*[.]html')
for html in "${a[@]}"; do echo ">>>${html}<<<"; done
mapfile -t a < <(find . -type f -iregex .*\.html$)
for html in "${a[@]}"; do echo ">>>${html}<<<"; done
>>>./  .html<<<
>>>./a b c.html<<<
>>>./ *.html<<<
mapfile -t a < <(find . -type f -iregex .*\.html$)
for html in "${a[@]}"; do printf '>>>%s<<<\n' "$html"; done
find . -type f -iregex .*\.html$ | while read line
do
  printf '>>>%s<<<\n' "$line"
done