因此,我需要编写一个 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)
我相信这将完成您的要求:
#!/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路径中,名称代表其来源的完整路径。
经典的方法是使用 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)