linux – mv包含shell脚本空格的文件

linux – mv包含shell脚本空格的文件,第1张

概述我试图mv一个文件(重命名它用破折号替换空格).如果我在没有引号的情况下传递source和dest参数,则源会被分解,因为mv认为它是参数的结尾. 如果我用参数包围source和dest,mv报告无法找到源.目前,$1和$2在开头和结尾都有硬编码的报价. $onam和$dnam是没有硬编码报价的等价物. 来自提示的此命令可以正常工作,因为source和dest被引号括起来: mv "/home/b 我试图mv一个文件(重命名它用破折号替换空格).如果我在没有引号的情况下传递source和dest参数,则源会被分解,因为mv认为它是参数的结尾.

如果我用参数包围source和dest,mv报告无法找到源.目前,$1和$2在开头和结尾都有硬编码的报价. $onam和$dnam是没有硬编码报价的等价物.

来自提示的此命令可以正常工作,因为source和dest被引号括起来:

mv "/home/bryan/renametest/TestFolder/test file" "/home/bryan/renametest/TestFolder/test---file"

这是我到目前为止所尝试的(输入和结果)

mv  mv: cannot stat `"/home/bryan/renametest/TestFolder/test   file"'   No such file or directorymv $onam $dnammv: cannot move `/home/bryan/renametest/TestFolder' to a subdirectory of itself,`/home/bryan/renametest/TestFolder/test---file'mv  $dnammv: cannot stat `"/home/bryan/renametest/TestFolder/test   file"':   No such file or directorymv $onam mv: cannot move `/home/bryan/renametest/TestFolder' to `"/home/bryan/renametest/TestFolder/test---file"':   No such file or directory

如何用空格移动这些文件?

解决方法 使用:

mv "$onam" "$dnam"

基本上,在包含可能包含空格的文件名的变量周围使用引号.但是,除非文件名或目录名本身包含引号,否则这些值本身不应包含引号.

不幸的是,我不能立即想到一个简单的方法来使用像$1这样的值和硬编码的引号.你必须弄乱eval或其他地方.

SSCCE(Short,Self-Contained,Correct Example)

此代码与您显示的代码同构,但实际上更多.运行和清理自己也是安全的.它假设您正在使用bash.请注意,带空格的名称在一行中包含多个空格;如果您尝试使用包含单个空格的名称,很容易被误导为虚假的安全感.

#!/bin/bashtestdir=test.$$mkdir "$testdir" || exit 1trap "rm -fr '$testdir'; exit 1" 0 1 2 3 13 15(    set -x    x=$'\n\n'    cd test.$$    basedir="$PWD"    sub1dir="rename  test"    sub2dir="Test   Folder"    subdir="$sub1dir/$sub2dir"    mkdir -p "$basedir/$subdir"    oldfile="test   file"    cp /etc/group "$basedir/$subdir/$oldfile"    echo "$x"    ls -lR .    echo "$x"    newfile=$(echo "$oldfile" | sed 's/ /-/g')    mv "$basedir/$subdir/$oldfile" "$basedir/$subdir/$newfile"    ls -lR .    echo "$x"    new2dir=$(echo "$sub2dir" | sed 's/ /-/g')    mv "$basedir/$subdir"  "$basedir/$sub1dir/$new2dir"    ls -lR .    echo "$x"    new1dir=$(echo "$sub1dir" | sed 's/ /-/g')    mv "$basedir/$sub1dir" "$basedir/$new1dir"    ls -lR .)rm -fr "$testdir"trap 0#    $mv "/home/bryan/renametest/TestFolder/test   file" "/home/bryan/renametest/TestFolder/test---file"##Here are some inputs and results.##    mv  #    mv: cannot stat `"/home/bryan/renametest/TestFolder/test   file"': No such file or directory##    mv $onam $dnam#    mv: cannot move `/home/bryan/renametest/TestFolder' to a subdirectory of itself,`/home/bryan/renametest/TestFolder/test---file'##    mv  $dnam#    mv: cannot stat `"/home/bryan/renametest/TestFolder/test   file"': No such file or directory##    mv $onam #    mv: cannot move `/home/bryan/renametest/TestFolder' to `"/home/bryan/renametest/TestFolder/test---file"': No such file or directory##IDeas?

你必须要小心;请注意我是如何从片段中建立名称并对其进行分解等的.但是要小心,它可以完成.

示例输出

使用bash -x运行,但你可以只用bash运行它,你只需跳过一点输出,因为它在子shell代码中包含一个set -x.

+ testdir=test.47648+ mkdir test.47648+ trap 'rm -fr '\''test.47648'\''; exit 1' 0 1 2 3 13 15+ set -x+ x=''+ cd test.47648+ basedir=/Users/jleffler/tmp/soq/x3/test.47648+ sub1dir='rename  test'+ sub2dir='Test   Folder'+ subdir='rename  test/Test   Folder'+ mkdir -p '/Users/jleffler/tmp/soq/x3/test.47648/rename  test/Test   Folder'+ oldfile='test   file'+ cp /etc/group '/Users/jleffler/tmp/soq/x3/test.47648/rename  test/Test   Folder/test   file'+ echo ''+ ls -lR .total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename  test./rename  test:total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 Test   Folder./rename  test/Test   Folder:total 8-rw-r--r--  1 jleffler  staff  2151 Apr  3 18:43 test   file+ echo ''++ echo 'test   file'++ sed 's/ /-/g'+ newfile=test---file+ mv '/Users/jleffler/tmp/soq/x3/test.47648/rename  test/Test   Folder/test   file' '/Users/jleffler/tmp/soq/x3/test.47648/rename  test/Test   Folder/test---file'+ ls -lR .total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename  test./rename  test:total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 Test   Folder./rename  test/Test   Folder:total 8-rw-r--r--  1 jleffler  staff  2151 Apr  3 18:43 test---file+ echo ''++ echo 'Test   Folder'++ sed 's/ /-/g'+ new2dir=Test---Folder+ mv '/Users/jleffler/tmp/soq/x3/test.47648/rename  test/Test   Folder' '/Users/jleffler/tmp/soq/x3/test.47648/rename  test/Test---Folder'+ ls -lR .total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename  test./rename  test:total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 Test---Folder./rename  test/Test---Folder:total 8-rw-r--r--  1 jleffler  staff  2151 Apr  3 18:43 test---file+ echo ''++ echo 'rename  test'++ sed 's/ /-/g'+ new1dir=rename--test+ mv '/Users/jleffler/tmp/soq/x3/test.47648/rename  test' /Users/jleffler/tmp/soq/x3/test.47648/rename--test+ ls -lR .total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename--test./rename--test:total 0drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 Test---Folder./rename--test/Test---Folder:total 8-rw-r--r--  1 jleffler  staff  2151 Apr  3 18:43 test---file+ rm -fr test.47648+ trap 0
总结

以上是内存溢出为你收集整理的linux – mv包含shell脚本空格的文件全部内容,希望文章能够帮你解决linux – mv包含shell脚本空格的文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1017877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存