Linux 将文件夹内容移动到嵌套文件夹中
我没想到这会是个问题。因为我认为coreutils支持这些东西,然后,cp ls和rm的肮脏组合就足够了 然而,事实并非如此,如果您现在能解释我的方法失败的原因,以及我应该如何以正确的方式做到这一点,我将不胜感激 代码 样本输出 Mythli$(ls…)命令在名称周围加上不需要的引号。考虑使用XARGS和后退引号。例如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
(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的方法是一个很好的方法