그래서 모든 파일을 지정된 디렉터리에 복사하는 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를 항상 사용하지 않는 경우 장점은 주로 셸 간 이식성입니다.
물론, 스크립트를 포기하고 그냥 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