因此,我需要编写一个 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