linux - 将文件夹内容递归移动到嵌套文件夹中

标签 linux bash unix gnu-coreutils

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

但是,情况并非如此,如果您现在向我解释我的方法失败的原因以及我应该如何以正确的方式做到这一点,我将不胜感激。

代码

function CheckoutFolder {
    local dir=$1


    mkdir "$dir/.CheckoutFolderTmp"
    (
        cd "$dir" \
        && cp -R $(ls -Q -A "$dir" --ignore=".CheckoutFolderTmp") "$dir/.CheckoutFolderTmp" \
        && rm -Rf  $(ls -Q -A "$dir" --ignore=".CheckoutFolderTmp")
    )
    mv "$dir/.CheckoutFolderTmp" "$dir/src"
    mkdir -p "$dir/"{build,log}
}

示例输出

++ CheckoutFolder /home/tobias/Develop/src/thelegacy/RCMeta
++ local dir=/home/tobias/Develop/src/thelegacy/RCMeta
++ mkdir /home/tobias/Develop/src/thelegacy/RCMeta/.CheckoutFolderTmp
++ cd /home/tobias/Develop/src/thelegacy/RCMeta
+++ ls -Q -A /home/tobias/Develop/src/thelegacy/RCMeta --ignore=.CheckoutFolderTmp
++ cp -R '"build"' '"buildmythli.sh"' '"CMakeLists.txt"' '".directory"' '".libbuildmythli.sh"' '"log"' '"RCMeta"' '"RCMetaTest"' '"src"' /home/tobias/Develop/src/thelegacy/RC
cp: cannot stat `"build"': No such file or directory
cp: cannot stat `"buildmythli.sh"': No such file or directory
cp: cannot stat `"CMakeLists.txt"': No such file or directory
cp: cannot stat `".directory"': No such file or directory
cp: cannot stat `".libbuildmythli.sh"': No such file or directory
cp: cannot stat `"log"': No such file or directory
cp: cannot stat `"RCMeta"': No such file or directory
cp: cannot stat `"RCMetaTest"': No such file or directory
cp: cannot stat `"src"': No such file or directory
++ mv /home/tobias/Develop/src/thelegacy/RCMeta/.CheckoutFolderTmp /home/tobias/Develop/src/thelegacy/RCMeta/src
++ mkdir -p /home/tobias/Develop/src/thelegacy/RCMeta/build /home/tobias/Develop/src/thelegacy/RCMeta/log
++ return 0

神话

最佳答案

正如 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 中运行。)

关于linux - 将文件夹内容递归移动到嵌套文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12393441/

相关文章:

linux - Virtualbox 启动挂载不会卸载

c - getopt() 解析模式不起作用

linux - 匹配两个文件中的字符串,并将第一个文件中匹配字符串的行追加到第二个文件的行尾

bash - PowerShell 通过脚本在环境变量范围内的灵活性

c - wait(null) 在这种情况下做了什么,程序的输出是什么?

curl下载文件的C程序

linux - 查询 linux 中套接字上的发送缓冲区使用情况

linux/unix 将定界文件转换为固定宽度

linux - bash: 无法输出: ps -ef|grep 到变量

bash - printf中的填充字符