【问题标题】:mkdir from grep and pipe来自 grep 和管道的 mkdir
【发布时间】:2013-11-15 21:39:43
【问题描述】:

我有一个小脚本,可以输出一些目录路径。 我想 mkdir 所有这些路径。

for filename in $(git ls-files | grep .java | grep -v 'com/foo' | sed -e 's/\(.java[^/]*\).java/\1/' | uniq)
do
echo "$filename" | sed -e 's/com\/old\/old/com\/new/' | sed 's/\(.*\)\/.*/\1/'
done

所以创建了新目录... com/old/old = com/new

但我无法让那个 mkdir 工作……我试过了……

path=$("$filename" | sed -e 's/com\/old\/old/com\/new/' | sed 's/\(.*\)\/.*/\1/')
mkdir -p "$path"

这只是弄乱了文件内容。

【问题讨论】:

    标签: grep pipe mkdir


    【解决方案1】:

    您应该可以在一个sed 命令中完成所有替换,它还可以过滤掉com/foo。然后将输出通过管道传输到while read 循环。

    git ls-files | grep .java |
            sed -e '/com\/foo/d' -e 's/\(.java[^/]*\).java/\1/' -e 's/com\/old\/old/com\/new/' -e 's/\(.*\)\/.*/\1/' |
            uniq | while read path; do
        mkdir -p "$path"
    done
    

    这里是你的git mv

    git ls-files | grep .java |
            sed -e '/com\/intuit/d' -e 's/\(.java[^/]*\).java/\1/' | uniq | 
        while read path; do
            dir=$(echo "$path" | sed -e 's/com\/old\/old/com\/new/' -e 's/\(.*\)\/.*/\1/')
            mkdir -p "$dir"
            git mv "$path" "$dir"
    done
    

    【讨论】:

    • 一点更新......所以 mkdir 正在工作,但实际上我还需要在创建 dir 后 git mv 文件。所以我需要原始文件路径。这只是回显原始路径,然后是新路径。对于 $(git ls-files | grep .java | grep -v 'com/intuit' | sed -e 's/(.java[^/]*).java/\1/' | uniq) 中的文件;回声 $file 回声 $file | sed -e 's/com\/old\/old/com\/new/' 完成
    • 只需删除删除文件名的sed 表达式。在循环体中,使用dirname $path 获取mkdir 的目录部分,然后将文件移入其中。
    • 我正在这样做.. git ls-files | grep .java | sed -e '/com\/intuit/d' -e 's/(.java[^/]*).java/\1/' |独特 |同时读取路径; do git mv $path $path | sed -e 's/com\/old\/old/com\/new/' done 但这只是弄乱了文件的内容..(实际上也需要在下一步中做)
    • 很难阅读那些未格式化的混乱,尤其是因为 SO 使用反引号进行标记。不要尝试将代码放入 cmets、添加到您的问题或开始一个新问题。无论如何,我已经更新了我的答案,这有帮助吗?
    • 哦,我明白了,您将 $path 回显到 sed 中。并创建一个变量 dir 然后可以用作 git mv 的输入
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多