我正在尝试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年及以上的旧习惯导致了很多杀戮。