Bash 循环过滤查找并执行操作
我有一堆Wordpress文件的垃圾堆,我正试图将它们全部转换成降价 我写的剧本是: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
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