替换文件名中的斜杠

替换文件名中的斜杠

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

例如,如果文件位于需要将文件重命名为的zad1.sh目录中/home/123456/__home__123456__zad1.sh

关于如何做到这一点有什么想法吗?

答案1

要获取文件的路径:

realpath <file>

在 bash 中替换:

echo "${var//search/replace}"

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

所以你的代码可能是

path=$(realpath zad1.sh)
path_replaced=${path//\//__}

答案2

我相信这会实现你所要求的:

#!/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

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

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

答案3

经典的方法是使用 sed:

cp "${filename}" "$(realpath ${filename} | sed s:/:__:g)"

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

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

find /base/path -type f -exec cp \{\} `realpath \{\} | sed s:/:__:g` \;

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

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

find /base/path -type f | sed -e "p; s:/:__:g" | xargs -n2 cp

答案4

我已经通过以下方法完成了

ls -ltr /root/l.txt| awk '{print "cp" " " $NF,$NF}'| awk '{gsub("/","_",$NF);print $1,$2,"/root/p1/"$3}'| sh

这里文件 /root/l.txt 将被复制到 /root/p1/ 路径,但文件名将是 _root_l.txt 如果有任何混淆请告诉我

Here /root/p1==> destination path

相关内容