Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本复制文件夹中的所有文件_Bash - Fatal编程技术网

bash脚本复制文件夹中的所有文件

bash脚本复制文件夹中的所有文件,bash,Bash,我正在编写一个shell脚本,如下所示: `ls中文件的` 做 mkdir“$file”\u文件夹 cp$文件“$文件”\u文件夹 完成 我要做的是为当前目录中的每个文件创建一个文件夹,并使用其名称,然后在文件夹下划线作为名称,然后将该文件复制到其中。我的问题是文件名中包含空格。我怎样才能逃脱他们? 有很多资源解释了如何对变量执行此操作,但没有一个资源可以应用于我使用for循环获取名称的情况。不要使用ls,使用shell globbing。(一般而言,) 不要在那里使用ls,使用shell g

我正在编写一个shell脚本,如下所示:

`ls中文件的
`
做
mkdir“$file”\u文件夹
cp$文件“$文件”\u文件夹
完成
我要做的是为当前目录中的每个文件创建一个文件夹,并使用其名称,然后在文件夹下划线作为名称,然后将该文件复制到其中。我的问题是文件名中包含空格。我怎样才能逃脱他们?
有很多资源解释了如何对变量执行此操作,但没有一个资源可以应用于我使用for循环获取名称的情况。

不要使用
ls
,使用shell globbing。(一般而言,)


不要在那里使用
ls
,使用shell globbing。(一般而言,)

ls
正是因为这个原因

中的文件的
*
做
mkdir“${file}\u文件夹”
cp“$file”“${file}\u文件夹”
完成
ls
正是因为这个原因

中的文件的
*
做
mkdir“${file}\u文件夹”
cp“$file”“${file}\u文件夹”
完成
怎么样

find . -type f -exec mkdir {}_folder \; -exec cp {} {}_folder \;
它在当前目录中查找所有常规文件,创建文件夹(第一个
-exec
),然后将文件复制到新文件夹(第二个
-exec
)。

如何

find . -type f -exec mkdir {}_folder \; -exec cp {} {}_folder \;

它在当前目录中查找所有常规文件,创建文件夹(第一个
-exec
),然后将文件复制到新文件夹(第二个
-exec
)。

问题是您使用
ls
的输出来驱动循环。你在循环中的引用是完美的;正如其中一个回复中所指出的,您应该双引号引用所有变量插值(至少直到您知道在什么情况下可以不引用为止)。问题是您使用
ls
的输出来驱动循环。你在循环中的引用是完美的;正如其中一个回复中所指出的,您应该对所有变量插值进行双引号引用(至少在您知道在什么情况下可以不引用之前)。您忘记了
cp
命令中第一个
$file
周围的引号。您不必将
nullglob
添加到以前的解决方案中;如果
file
设置为
'*'
[-f“${file}”]
的计算结果为false,跳过名为
*
@Adrian的可能不存在的文件:这会造成任何伤害吗?如果不是一个匹配,它不是一个比较好的实践吗?这是一个偏爱的问题,但是考虑1)它引入了一个BasHistor到另一个可能的“可移植的”脚本,2)你需要记住在代码部分之后对它进行不设置,因为它可能会引入非预期的行为(看看为什么不在它上使用它)。“设置为默认值并忽略”-basis),这就是为什么我自己更喜欢添加简单的
[-f |-d |-e“${foo}”]
检查循环内部-它很容易阅读,输入的字符更少,你不需要思考,而且更便于携带。它会造成伤害。@Adrian:没有考虑过那么多可能的副作用。感谢所有这些信息,非常感谢。你忘记了
cp
命令中第一个
$文件
周围的引号。你可以我不必将
nullglob
添加到以前的解决方案中;如果
file
设置为
'*'
[-f“${file}”]< /COD>无论如何都要跳过一个可能不存在的文件,名为“代码> */COD>”。@阿德里安:这有什么害处吗?如果不能匹配,这不是一个比较好的练习吗?这是一个偏爱的问题,但请考虑1)它引入了一个BasHistor到另一个可能的“便携式”。“脚本和2)您需要记住在所讨论的代码部分之后取消设置它,因为它可能会在脚本的后续部分引入非预期行为(请参见为什么在“设置为默认并忘记”的基础上使用它不是一个好主意)。这就是为什么我自己更喜欢在循环中添加简单的
[-f |-d |-e“${foo}”]
检查-它易于阅读,输入的字符更少,您无需思考,而且更便于移植。阿德里安:我没那么多考虑过可能的副作用。感谢所有这些信息,非常感谢。如果没有
nullglob
,如果目录中没有文件,这将失败(
file
将设置为literal
*
),因此
[-f“${file}]]
检查Mat的答案。如果没有
nullglob
,如果目录中没有文件,这将失败(
file
将被设置为文本
*
),因此
[-f“${file}”]
检查Mat的答案。