替换文件名中的斜杠

Dav*_*ers 8 bash shell-script

因此,我需要编写一个 bash 脚本,将所有文件复制到指定目录,但是我需要通过将/字符替换为__.

例如,如果文件zad1.sh在目录中,/home/123456/则文件需要重命名为__home__123456__zad1.sh

关于如何做到这一点的任何想法?

小智 13

要获取文件的路径:

realpath <file>
Run Code Online (Sandbox Code Playgroud)

在 bash 中替换:

echo "${var//search/replace}"
Run Code Online (Sandbox Code Playgroud)

前两个斜杠用于进行全局搜索。使用 just/只会进行一次替换。

所以你的代码可能是

path=$(realpath zad1.sh)
path_replaced=${path//\//__}
Run Code Online (Sandbox Code Playgroud)


jes*_*e_b 6

我相信这将完成您的要求:

#!/bin/bash

_from_dir=/path/to/files
_to_dir=/path/to/dest

for file in "${_from_dir}/"*; do
    nfile="$(sed 's#/#__#g' <<<"$file")"
    cp "$file" "${_to_dir}/$nfile"
done
Run Code Online (Sandbox Code Playgroud)

将_from_dir变量设置为文件所在的路径,将_to_dir变量设置为要复制文件的路径。

循环将遍历该_from_dir位置中的每个文件。 nfile将采用文件的完整路径并替换/为__. 然后它将cp文件放入_to_dir路径中,名称代表其来源的完整路径。


Per*_*ins 2

经典的方法是使用 sed:

cp "${filename}" "$(realpath ${filename} | sed s:/:__:g)"
Run Code Online (Sandbox Code Playgroud)

如果您不一定总是使用 bash,其优点主要是跨 shell 的可移植性。

当然,它也可以让你放弃脚本,只用 find 来完成:

find /base/path -type f -exec cp \{\} `realpath \{\} | sed s:/:__:g` \;
Run Code Online (Sandbox Code Playgroud)

如果您需要仅复制某些文件,“查找”具有排序和过滤选项,您可以使用它们。

编辑:该查找设置适用于我的一个系统,但不适用于另一系统。我没有解决差异,而是让它更加便携:

find /base/path -type f | sed -e "p; s:/:__:g" | xargs -n2 cp
Run Code Online (Sandbox Code Playgroud)

  • 该“find”命令将不起作用。反引号将在“find”之前进行评估,基本上相当于“$PWD/{}”,其中“$PWD”中的斜杠替换为双下划线。所以,如果你在 `/home/user` 中,这相当于: `find /base/path -exec cp {} __home__user__{} \;` 如果你在 `/base/path 中有一个文件 `f` `,这将尝试将其复制到`__home__user__/base/path/f`。 (5认同)