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年及以上的旧习惯导致了很多杀戮。
linux mv文件个数,关于linux:mv一个文件,其中包含Shell脚本中的空格相关推荐
- Linux教程 - 在Shell脚本中声明和使用布尔变量示例
需要定义一个名为failed的bash变量,并将值设置为False.当从cron作业调用我们的脚本时,特定的任务可能会失败,然后我需要将failed转换为True.基于$failed,我需要发送一封电 ...
- 【linux】Shell脚本中调用另外一个脚本的方法
在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一 ...
- Linux的简单shell脚本中修改文件操作
Linux的简单shell脚本中修改文件操作 Linux Shell常用技巧(三) sed 八.流编辑器sed 8.1 sed简介 sed是stream editor的缩写,一种流编辑器,它一次处理一 ...
- linux shell 获取表,bash - 如何获取shell脚本中目录中的文件列表?
bash - 如何获取shell脚本中目录中的文件列表? 我试图使用shell脚本获取目录的内容. 我的脚本是: for entry in `ls $search_dir`; do echo $ent ...
- Linux下将数据文件的指定域读取到shell脚本中
Linux下将数据文件的指定域读取到shell脚本中 这个例子说明了怎样在Linux下shell脚本中从数据文件读取特定的域(field)并进行操作.例如,假设文件employees.txt的格式是{ ...
- linux脚本中如何读取文件,如何在Shell脚本中逐行读取文件
原标题:如何在Shell脚本中逐行读取文件 在这里,我们学习Shell脚本中的3种方法来逐行读取文件. 方法一.使用输入重定向 逐行读取文件的最简单方法是在while循环中使用输入重定向. 为了演示, ...
- linux判断文件类型是否存在脚本,shell脚本中的逻辑判断 文件目录属性判断 if特殊用法 case判断...
一.shell脚本中的逻辑判断 在shell脚本中,很多都会逻辑判断,判断某一个数值,判断某一个文件,或者某一个目录,我们针对判断结果再做一些操作,如果没有判断,就没法做一些操作 格式1:if条件:t ...
- linux shell 读取csv文件内容,在Shell脚本中读取CSV文件,直到没有标题的行结束
我有一个名为'readfile.csv'的文件,其中包含以下内容. Name Id VAl Number IP James,007,$500,111-111-111,111-000-000 Bond, ...
- linux shell rsync,linux – 如何在我的下面的shell脚本中使用rsync而不是scp来复制文件?...
我正在使用scp并行使用GNU并行复制文件与我的下面的 shell脚本,它工作正常. 我不知道如何在下面的shell脚本中使用rsync代替scp.我试图看看rsync与传输速度方面的scp相比是否会 ...
- linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
最新文章
- 元素周期表超清pdf_重磅分享||化学II卷5个大题汇编PDF
- 【NOIP普及组】2016模拟考试(10.29)——排座椅
- Controller 如果能保持单例,尽量使用单例
- (PCB)进程控制块
- Docker多步构建更小的Java镜像
- 使用Java从地图中删除元素
- 2020计算机二级题库第14PPT,计算机二级考试MSOffice考精彩试题库ppt操作题附问题详解.doc...
- java二叉树原理_史上最全二叉树遍历详解(Java实现,原理相同)
- linux 系统信号忽略和system函数返回值问题(system的实现)
- B端产品运营基本工作内容
- 20194307肖江宇Exp-4 恶意代码分析
- 成功解决windows系统开机时,系统提示此windows副本不是正版
- Springboot配置Redis报:io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.
- linux下罗技摄像头采集图片,网络摄像头罗技和Linux
- spring boot rest例子
- 谷歌浏览器提示客户端和服务器不支持一般 SSL 协议版本或加密套件(亲测有效)
- @PersistenceContext和@Autowired在EntityManager上应用的区别。
- 做梦都想复习的网络编程
- vscode安装python插件失败_vscode安装python插件
- 灰度图像压缩 DP算法 位运算详解