想象一下,我有一个文件夹/文件结构,如下所示
a/b/c_d.e
a/b/d.f
我想破坏文件名,以便路径分隔符变为_
,文件夹和文件之间是-
,然后将其添加到文件夹位置。
a/b/a_b-c_d.e
a/b/a_b-d.f
到目前为止我所拥有的:
find . -type f -name *.c -exec sh -c "echo -n { {} | xargs dirname }; echo -n "/"; realpath --relative-to="$PWD" "{}" | tr '/' '_'" \;
将输出
./src/ucd-tools/src
/src_ucd-tools_src_proplist.c
似乎第一个echo -n
正在添加新行,但如果我手动运行echo -n "Hello"
,它会按预期工作而不会有新行。
答案 0 :(得分:4)
如果您在bash 4中,那么您在shell中拥有所需的一切。无需使用find
等外部工具。
这可能是一个单行。
$ shopt -s globstar # This requires bash 4. Lets you use "**"
$ for f in **; do test -f "$f" || continue; d=${f%/*}; echo mv "$f" "$d/${d//\//_}-${f##*/}"; done
为便于阅读而破裂:
for f in **; do # recurse through directories,
test -f "$f" || continue # skipping anything that isn't a file
d=${f%/*} # capture the directory...
mv -- "$f" "$d/${d//\//_}-${f##*/}" # and move the file.
done
mv
行上的“目标”由以下内容组成:
$d
- 原始目录(因为文件停留在同一个地方)${d//\//_}
- 使用参数扩展替换所有带下划线的斜杠${f##*/}
- 删除dirname,所以这只是文件名。答案 1 :(得分:0)
只需使用printf
即可。它基本上与echo
类似,但它不会打印新行,例如:
computer:~user$echo "hello, world"
hello, world
computer:~user$printf "hello, world"
hello, worldcomputer:~user$echo "hello, world"