来自grep和pipe的mkdir

来自grep和pipe的mkdir,grep,pipe,mkdir,Grep,Pipe,Mkdir,我有一个小脚本,它显示了一些dir路径。 我想知道所有这些路径 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/o

我有一个小脚本,它显示了一些dir路径。 我想知道所有这些路径

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"

这只会弄乱文件内容

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

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);执行echo$file echo$file | sed-e's/com\/old\/old/com\/new/'done必须删除删除文件名的
sed
表达式。在循环体中,使用
dirname$path
获取
mkdir
的目录部分,然后将文件移动到其中。。git ls文件| grep.java | sed-e'/com\/intuit/d'-e's/(.java[^/]*).java/\1/'| uniq |读取路径;do git mv$path
$path|sed-e's/com\/old\/old/com\/new/'
完成了,但这只是弄乱了文件的内容。。(这实际上也需要在下一步中完成)很难读取未格式化的混乱,特别是因为SO使用反标记进行标记。不要试图在注释中添加代码、添加问题或开始新的问题。不管怎样,我已经更新了我的答案,这有帮助吗?哦,是的,我明白了,你把$path回显到sed中。并创建一个变量dir,该变量可以用作git mv的输入