gpt4 book ai didi

linux - mv 包含来自 shell 脚本的空格的文件

转载 作者:IT王子 更新时间:2023-10-29 01:23:36 25 4
gpt4 key购买 nike

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

如果我用参数将 source 和 dest 括起来,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

如何移动那些带空格的文件?

最佳答案

使用:

mv "$onam" "$dnam"

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

不幸的是,我无法立即想到一种简单的方法来使用像 $1 这样的值,并在它们周围硬编码引号。你必须搞乱 eval 或类似的东西。


SSCCE ( Short, Self-Contained, Correct Example )

此代码与您展示的代码同构,但实际上做的更多。它也可以安全地运行并自行清理。它假定您正在使用 bash。请注意,带空格的名称在一行中包含多个空格;如果您尝试使用包含单个空格的名称,很容易被误导为安全感。

#!/bin/bash
testdir=test.$$
mkdir "$testdir" || exit 1

trap "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 $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 在子 shell 代码中。

+ 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

关于linux - mv 包含来自 shell 脚本的空格的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com