防止添加新行的回声

时间:2017-11-11 12:59:41

标签: bash echo

想象一下,我有一个文件夹/文件结构,如下所示

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",它会按预期工作而不会有新行。

2 个答案:

答案 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"