linux mv文件个数,关于linux:mv一个文件,其中包含Shell脚本中的空格

我正在尝试mv文件(将其重命名以用破折号替换空格)。 如果我将source和dest参数传递为不带引号,则源会被分解,因为mv认为它是参数的结尾。

如果我在源和目标周围加上参数,则mv报告找不到源。 当前,$ 1和$ 2在开头和结尾都有硬编码的引号。 $ onam和$ dnam是没有硬编码引号的等效项。

提示中的此命令非常有效,因为source和dest用引号引起来:

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

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

mv $1 $2

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 $1 $dnam

mv: cannot stat `"/home/bryan/renametest/TestFolder/test   file"':

No such file or directory

mv $onam $2

mv: cannot move `/home/bryan/renametest/TestFolder' to `"/home/bryan/renametest/TestFolder/test---file"':

No such file or directory

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

这个:stackoverflow.com/questions/2709458/

正如对其他相关问题之一的评论中所建议的那样,请从可变内容中删除引号。 否则,外壳程序将寻找名称中带有""的文件。

香港专业教育学院有和没有引号。 请阅读上面。"当前,$ 1和$ 2在开头和结尾都有硬编码的引号。$ onam和$ dnam是没有硬编码引号的等效项。"

采用:

mv"$onam""$dnam"

基本上,对包含可能包含空格的文件名的变量使用引号。但是,值本身不应包含引号,除非文件名或目录名称本身包含引号。

不幸的是,我无法立即想到一种简单的方法来使用像$1这样的值,并在其周围加上引号。您必须弄乱eval或附近。

SSCCE(简短,独立,正确的示例)

该代码与您显示的代码是同构的,但实际上还有更多功能。运行并清理自身也很安全。假定您正在使用bash。请注意,带空格的名称在一行中包含多个空格。如果您尝试使用包含单个空格的名称,则很容易被误认为是一种错误的安全感。

#!/bin/bash

testdir=test.$$

mkdir"$testdir" || exit 1

trap"rm -fr '$testdir'; exit 1" 0 1 2 3 13 15

(

set -x

x=$'

'

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 $1 $2

#    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 $1 $dnam

#    mv: cannot stat `"/home/bryan/renametest/TestFolder/test   file"': No such file or directory

#

#    mv $onam $2

#    mv: cannot move `/home/bryan/renametest/TestFolder' to `"/home/bryan/renametest/TestFolder/test---file"': No such file or directory

#

#Ideas?

您一定要小心;请注意我是如何从片段中建立名称并对其进行分解等的。但是,只要小心,就可以做到。

示例输出

使用bash -x运行,但是您可以仅使用bash运行它,而只跳过一些输出,因为它在子外壳程序代码中包含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 0

drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename  test

./rename  test:

total 0

drwxr-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 0

drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename  test

./rename  test:

total 0

drwxr-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 0

drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename  test

./rename  test:

total 0

drwxr-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 0

drwxr-xr-x  3 jleffler  staff  102 Apr  3 18:43 rename--test

./rename--test:

total 0

drwxr-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

mv" $ onam"" $ dnam" mv:无法移动homebryanrenametestTestFolder to a subdirectory of itself, / home / bryan / renametest / TestFolder / test ---文件

$ onam = / home / bryan / renametest / TestFolder / test文件

那是一个单独的问题。您显然正在尝试将文件夹移动到新位置,并且该新位置是其当前位置的子目录。您显示的错误消息与$onam的声明值不一致。在问题的更新中显示sh -x yourscript的输出以及您提供的任何团(以便您可以正确格式化输出)。

否。如果检查onam的值,您将看到mv命令正在破坏该值,因为" test"和" file"之间存在空格。我已经给出了onam的确切值。 1等同于onam,但带有硬编码的引号。

请参阅SSCCE。如果您在研究后仍然有问题,请提供您自己的SSCCE类似物,我们可以看到差异之处。

好,谢谢。我会尽快给您回复。

谢谢乔纳森。在您的帮助下,我已经修复了该部分。现在,我有另一个(我认为)应该很简单。

您可以使用bash变量替换-onam="the file"; echo ${onam -}-> the--file将空格更改为破折号而无需sed

@evilotto:是的,但是旧习惯很难消亡,而且25年及以上的旧习惯导致了很多杀戮。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值