Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
Linux 将文件夹内容移动到嵌套文件夹中_Linux_Bash_Unix_Gnu Coreutils - Fatal编程技术网

Linux 将文件夹内容移动到嵌套文件夹中

Linux 将文件夹内容移动到嵌套文件夹中,linux,bash,unix,gnu-coreutils,Linux,Bash,Unix,Gnu Coreutils,我没想到这会是个问题。因为我认为coreutils支持这些东西,然后,cp ls和rm的肮脏组合就足够了 然而,事实并非如此,如果您现在能解释我的方法失败的原因,以及我应该如何以正确的方式做到这一点,我将不胜感激 代码 样本输出 Mythli$(ls…)命令在名称周围加上不需要的引号。考虑使用XARGS和后退引号。例如 (cd "$dir" && cp -R `ls -Q -A "$dir" --ignore=".CheckoutFolderTmp"` "$dir/.Checko

我没想到这会是个问题。因为我认为coreutils支持这些东西,然后,cp ls和rm的肮脏组合就足够了

然而,事实并非如此,如果您现在能解释我的方法失败的原因,以及我应该如何以正确的方式做到这一点,我将不胜感激

代码

样本输出

Mythli

$(ls…)命令在名称周围加上不需要的引号。考虑使用XARGS和后退引号。例如

(cd "$dir" && cp -R `ls -Q -A "$dir" --ignore=".CheckoutFolderTmp"` "$dir/.CheckoutFolderTmp" && ls -Q -A "$dir" --ignore=".CheckoutFolderTmp" | xargs rm -Rf  )
cp输出不太友好,但它确实提供了所需的信息

cp:  cannot stat '"build"': No such file or directory
跳到最后一句“没有这样的文件或目录”。“cannot stat”很神秘,但它意味着“cp”使用“stat”来获取有关它试图复制的文件或目录的一些信息。“统计”失败。它失败,在名为“build”的文件(或目录)上出现“无此类文件或目录”的错误。这是因为,cp内部的实际参数是“build”(注意引号),而您想要的文件名是build(注意没有引号)

$(ls…)用-Q调用以加引号(可能是为了处理带有空格、逗号和其他违规字符的文件名)。但是$(ls…)已经为您添加了报价。如果使用-0,xargs还可以处理时髦的文件名。

$(ls…)命令会在名称周围加上不需要的引号。考虑使用XARGS和后退引号。例如

(cd "$dir" && cp -R `ls -Q -A "$dir" --ignore=".CheckoutFolderTmp"` "$dir/.CheckoutFolderTmp" && ls -Q -A "$dir" --ignore=".CheckoutFolderTmp" | xargs rm -Rf  )
cp输出不太友好,但它确实提供了所需的信息

cp:  cannot stat '"build"': No such file or directory
跳到最后一句“没有这样的文件或目录”。“cannot stat”很神秘,但它意味着“cp”使用“stat”来获取有关它试图复制的文件或目录的一些信息。“统计”失败。它失败,在名为“build”的文件(或目录)上出现“无此类文件或目录”的错误。这是因为,cp内部的实际参数是“build”(注意引号),而您想要的文件名是build(注意没有引号)


$(ls…)用-Q调用以加引号(可能是为了处理带有空格、逗号和其他违规字符的文件名)。但是$(ls…)已经为您添加了报价。如果使用-0,xargs还可以处理时髦的文件名。

正如莱斯所说,
ls-Q
在文件名周围加上引号,这些引号在参数中传递给
cp
rm
。(当您实际键入命令时,使用引号引用和分隔参数是Bash命令行的一个方面;当您将一个命令的输出传递到另一个命令时,它不起作用。)一般来说,解析
ls
的输出通常不是一个好主意

以下是另一种方法:

function CheckoutFolder() (
    cd "$1"

    mkdir .CheckoutFolderTmp

    find -mindepth 1 -maxdepth 1 -not -name .CheckoutFolderTmp \
         -exec mv {} .CheckoutFolderTmp/{} \;

    mv .CheckoutFolderTmp src

    mkdir build log
)

(注意,我用括号括起函数体,
(…)
,而不是用大括号括起函数体,
{…}
。这会导致整个函数在子shell中运行。)

正如Les所说,
ls-Q
在文件名周围加上引号,这些引号在参数中传递到
cp
rm
。(当您实际键入命令时,使用引号引用和分隔参数是Bash命令行的一个方面;当您将一个命令的输出传递到另一个命令时,它不起作用。)一般来说,解析
ls
的输出通常不是一个好主意

以下是另一种方法:

function CheckoutFolder() (
    cd "$1"

    mkdir .CheckoutFolderTmp

    find -mindepth 1 -maxdepth 1 -not -name .CheckoutFolderTmp \
         -exec mv {} .CheckoutFolderTmp/{} \;

    mv .CheckoutFolderTmp src

    mkdir build log
)

(请注意,我用括号括起函数体
(…)
,而不是大括号
{…}
。这会导致整个函数在子shell中运行。)

引号在那里,因为我将(-Q,--quote name include entry names in double quotes)参数传递给ls。或者你是说别的什么?cp:cannot stat“blah blah”中有额外的引号。很抱歉,我手头没有Linux可供测试,但请尝试暂时删除-Q。谢谢,我通过这种方式工作并学到了一些新东西。然而,我发现ruakh的解决方案比我自己讨厌的ls方法更干净。我同意ruakh的方法是一种很好的方法引号在那里,因为我将(-Q,--quote name include entry name in double quotes)参数传递给了ls。或者你是说别的什么?cp:cannot stat“blah blah”中有额外的引号。很抱歉,我手头没有Linux可供测试,但请尝试暂时删除-Q。谢谢,我通过这种方式工作并学到了一些新东西。然而,我发现ruakh的解决方案比我自己讨厌的ls方法更干净。我同意ruakh的方法是一个很好的方法