파일 이름의 슬래시 바꾸기

파일 이름의 슬래시 바꾸기

그래서 모든 파일을 지정된 디렉터리에 복사하는 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

관련 정보