尽管我已经阅读了有关处理路径名中空格的大部分问题,但我还没有找到我的案例,即关于一个变量中的多个路径名。
find 当给出两个基本路径时将需要这个,例如:
pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ...
Run Code Online (Sandbox Code Playgroud)
这将寻找在比赛中都 folder1和folder2。
(请注意,这是一个简化的示例;我非常清楚,在这种特殊情况下,您可以使用-path带有folder*跨越两个文件夹的参数的修饰符。但是,这个问题涵盖了您无法解决该问题的情况,因此很容易因为更高的复杂性。)
现在想象一下folder2中间有一个空格。下面将不工作:
pa="/home/user/folder1 /home/user/fol\ der2"
find $pa -name '*xy*' ...
Run Code Online (Sandbox Code Playgroud)
问题是\,它通常用于表示 shell 中的空格,但当变量内容被双引号括起来时将不起作用。但是,与每个变量一条路径不同(它可能会起作用),以下内容也不起作用:
pa=/home/user/folder1 /home/user/fol\ der2
find $pa -name '*xy*' ...
Run Code Online (Sandbox Code Playgroud)
$ ./test.sh: line 3: /home/user/fol der2: Is a directory
以下变体也不会:
pa=/home/user/folder1 /home/user/fol\ der2
find "$pa" -name '*xy*' ...
Run Code Online (Sandbox Code Playgroud)
那么如果多个路径包含在一个变量中,如何正确处理路径中的空格呢?
相关问题:是否有任何可靠的方法来确定空格是一个路径与其后继者(在同一变量内)之间的分隔符,还是属于其中包含的路径之一的空格?
我正在使用安装了 OS X 的 MacBook。
我在终端上试图转到一个目录。所以我在家里,我使用命令ls,有一个VirtualBox VMs目录。
但是当我尝试这样做时,cd VirtualBox VMs它说“没有这样的文件或目录”
为什么?
是因为word中的空格键吗?我怎样才能解决这个问题?
我希望能够打印并查看文本文件中的尾随空格(仅显示,而不是删除)。
我试过用cat -vwhich 假设显示非打印字符,但它没有按预期显示它们(行之间没有视觉差异)。例如
$ printf "foo\nbar \t\n" > file.txt
$ cat -v file.txt
foo
bar
Run Code Online (Sandbox Code Playgroud)
通过打印/显示空格,我的意思是一些视觉人类指示,与其他行相比,尾随空格在那里,没有一些特殊字符、颜色(例如使用 显示文件时git diff)或类似的东西。
有没有其他办法?
注意:我使用的是 macOS Sierra,但是我可以访问 GNU 和 BSDcat命令:
$ type -a cat
cat is /usr/local/opt/coreutils/libexec/gnubin/cat
cat is /bin/cat
$ cat --version
cat (GNU coreutils) 8.28
$ /bin/cat --version
/bin/cat: illegal option -- -
usage: cat [-benstuv] [file ...]
Run Code Online (Sandbox Code Playgroud) 我有一个关于在执行 shell 脚本时如何添加参数的问题。
我有一个简单的脚本可以帮助我阻止 ip 范围:
~/block_ip.sh:
if [ ! $3 ]
then
echo "usage ~/block_ip.sh (DROP/ACCEPT) '0.0.0.0' 'amsterdam'"
exit 1
fi
echo "adding $3"
sudo iptables -I INPUT -s $2 -j $1 -m comment --comment "$3"
Run Code Online (Sandbox Code Playgroud)
如果我在没有参数的情况下执行此操作,则输出符合预期:
~$ ./block_ip.sh
usage ~/block_ip.sh (DROP/ACCEPT) '0.0.0.0' 'amsterdam'
Run Code Online (Sandbox Code Playgroud)
然而,空格似乎是“二元运算符预期”意外输出的原因:
~$ ./block_ip.sh DROP '1.0.0.0/8' 'south brisbane qld'
./block_ip.sh: line 1: [: brisbane: binary operator expected
adding south brisbane au
Run Code Online (Sandbox Code Playgroud)
但是尽管有意外的输出,它还是添加了它:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP …Run Code Online (Sandbox Code Playgroud) 考虑一个具有典型 Microsoft Windows 文件名的目录:
新建文档.txt 文件 Foo - Copy.doc
我想对每个文件做一些事情,例如:
对于 $(find ${POLLDIR} -type f -mmin +1 -print0) 中的 sendfile
做
回声 \"${sendfile}\"
ls -l "${sendfile}"
等等
如果成功_以上
然后
mv "${sendfile}" "${donedir}/."
菲
完毕
请注意,我不想只以“${sendfile}”作为参数运行 1 个命令。我需要循环来做错误检查和其他事情(比如在成功时移动“${sendfile}”并在失败时登录)。
什么是从 find 转义/引用文件名的“正确”构造,以便我可以在ls上面的命令中使用它们?如果可能,我想避免将文件名一一存储在临时文件中。
我不认为find -printf '"%p"\n'正如三重奏在对问题[当文件名包含空格时如何使用查找?] 将在for foo in $(...) do构造中工作。
我认为?在这种情况下替换“非法”字符对我有用,但这会非常难看。for 循环最终处理 ${POLLDIR} 中的文件,然后在完成后移动它们,因此“Foo bar.txt”与“Foo-bar.txt”冲突的机会为 0 (-ish)。
到目前为止,我最好的尝试是:
对于 $(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?') 中的 … 在 bash 脚本中,我将 PDF 逐页光栅化为单个文件,最后生成的单个 PNG 再次合并到 PDF 中,如下所示:
\n\nconvert -monitor /path/to/1.png /path/to/2.png /path/to/3.png ... output.pdf\nRun Code Online (Sandbox Code Playgroud)\n\n脚本仍然存在的唯一问题是无法正确处理带有空格的文件。以下是我尝试过的一些事情:
\n\nnewfile=$(sed -r -e \'s| |\\\\ |g\' <<< "$tmppath$curr.png")\necho "DEBUG: newfiles : $newfiles"\nfilearray[$curr-1]="$newfiles"\necho "DEBUG: filearray: ${filearray[*]}"\nRun Code Online (Sandbox Code Playgroud)\n\n这产生(每页/文件):
\n\nDEBUG: newfiles : /tmp/pngpdf/file\\ with\\ spaces/1.png\nDEBUG: filearray: /tmp/pngpdf/file\\ with\\ spaces/1.png\nRun Code Online (Sandbox Code Playgroud)\n\n后来,我有两条调试消息
\n\necho "DEBUG: filearray: ${filearray[*]}"\necho "DEBUG: ${filearray[0]}, ${filearray[1]}, ${filearray[2]}, ..."\nRun Code Online (Sandbox Code Playgroud)\n\n查看filearray多个文件/页面的外观:
DEBUG: filearray: /tmp/pngpdf/file\\ with\\ spaces/1.png /tmp/pngpdf/file\\ with\\ spaces/2.png /tmp/pngpdf/file\\ with\\ spaces/3.png /tmp/pngpdf/file\\ with\\ spaces/4.png /tmp/pngpdf/file\\ …Run Code Online (Sandbox Code Playgroud) 我使用了一个名为 mp3wrap 的实用程序,它将多个 mp3 合并为一个。假设我有一个目录“album 1”,其中包含三个文件“track 1.mp3”、“track 2.mp3”和“track 3.mp3”。我将运行以下命令:
mp3wrap album\ 1.mp3 album\ 1/*.mp3
Run Code Online (Sandbox Code Playgroud)
这会将“album 1”目录(第二个参数)中的所有三首曲目合并到一个新文件“album 1.mp3”(第一个参数)中。
我有一堆这样的目录,“专辑 2”,“专辑 3”等等,我想写一个脚本来自动化这个过程。我试过这个:
for i in album*
do
mp3wrap $i.mp3 $i/*.mp3
done
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
1.mp3: No such file or directory
Run Code Online (Sandbox Code Playgroud)
似乎我的脚本将 $i 扩展为“album 1.mp3”,它作为两个单独的参数传递。经过一些搜索和阅读,我最终得到了这个:
for i in album*
do
mp3wrap "${i}.mp3" "${i}/*.mp3"
done
Run Code Online (Sandbox Code Playgroud)
现在我没有收到错误消息,而是从 mp3wrap 程序中获得了“使用”页面。很明显,它接收参数的方式与我从命令行运行命令时的方式不同,而且我不知道如何检查 bash 脚本执行时实际命令行的样子。
我究竟做错了什么?任何帮助表示赞赏!
如何将前导空格与sed(所有这些)匹配?我不是在谈论前导标签,而只是在前导空格上。
从我在 Nano 中做的一个小测试来看,这似乎是正确的:
sed "s/^ //g"
Run Code Online (Sandbox Code Playgroud)
你觉得这个方法有什么问题吗?
注意:“全部”是指文档中的所有前导空格,以防有 2 个或更多,而不仅仅是一个。
我必须修改参数文件中的一些参数,可能如下所示:
MY_VAR=YES
Run Code Online (Sandbox Code Playgroud)
我想使用`sed并想出了这个:
sed -i 's/MY_VAR=[A-Z]*/MY_VAR=NO/' sed.txt这似乎有效,现在我也希望它匹配,如果文件看起来像
MY_VAR = YES
Run Code Online (Sandbox Code Playgroud)
或任何其他空白格式,我该怎么做?我尝试过sed -i 's/MY_VAR\s=\s[A-Z]*/MY_VAR=NO/' sed.txt,但没有成功。我该如何正确地做到这一点?
我正在开始使用 bash 脚本。我正在处理包含空格字符的数组元素。在下面的代码中,第三个数组元素是“Accessory Engine”。我尝试使用\符号设置空格字符,但这无济于事。
在较大的例程中(此处未包含),我使用数组元素通过命令行工具自动执行某些操作。这些命令行工具将接受“附件引擎”作为输入。
#!/bin/bash
components="Persistence Instrument Accessory\Engine"
for i in $components; do
echo ${i}
done
Run Code Online (Sandbox Code Playgroud)
现在这段代码的输出是:
Persistence
Instrument
Accessory\Engine
Run Code Online (Sandbox Code Playgroud)
但我希望它是:
Persistence
Instrument
Accessory Engine
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
whitespace ×10
bash ×6
filenames ×3
shell-script ×3
find ×2
sed ×2
arguments ×1
array ×1
cat ×1
cd-command ×1
command-line ×1
osx ×1
path ×1
shell ×1
wildcards ×1