한 디렉터리의 하위 폴더를 동일한 파일이 정리되어 있지 않은 다른 디렉터리에 추가하고 파일 앞에 폴더 이름을 추가하는 방법

한 디렉터리의 하위 폴더를 동일한 파일이 정리되어 있지 않은 다른 디렉터리에 추가하고 파일 앞에 폴더 이름을 추가하는 방법

저는 R 사용자이고 아직 Unix나 명령줄 코딩에 익숙하지 않습니다. 파일이 포함된 하위 폴더가 있는 디렉터리가 있고 파일 이름은 모두 동일하지만 하위 폴더는 없는 다른 디렉터리가 있습니다(그러나 내용이 수정되었으므로 해당 디렉터리를 사용해야 함). 이전 디렉터리의 파일 이름과 구조를 일치시켜 새 디렉터리에 하위 폴더를 만드는 방법은 무엇입니까? 모든 새 파일에 폴더 이름을 추가할 수 있도록 만들고 싶습니다. 조직의 원래 디렉터리에 있는 파일 이름에 폴더 이름을 추가한 다음 이전 파일 이름의 일부를 일치시켜 새 파일 이름을 업데이트하는 것이 더 쉽다면 그것도 괜찮습니다.

답변1

이전 데이터 파일의 전체 경로가 다음 위치에 있다고 가정합니다 dir1.

$ ls -l dir1/*/*
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/A/file_1
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/A/file_2
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/A/file_3
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/B/file_4
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/B/file_5
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/B/file_6
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/C/file_7
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/C/file_8
-rw-------  1 jim  wheel  0 Apr 13 10:24 dir1/C/file_9
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_1
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_2
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_3
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_4
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_5
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_6
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_7
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_8
-rw-------  1 jim  wheel  0 Apr 13 10:55 dir1/D/file_9

경로가 없는 새 데이터 파일은 다음 위치에 있습니다 dir2.

$ ls -l dir2/*
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_1
-rw-------  1 jim  wheel   0 Apr 13 10:57 dir2/file_10
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_2
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_3
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_4
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_5
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_6
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_7
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_8
-rw-------  1 jim  wheel  29 Apr 13 10:24 dir2/file_9

스크립트를 생성하는 경우 test.sh:

$ cat << EOF > test.sh
#!/usr/bin/env bash

# pathA has sub-dir paths to files which contain old data:

pathA="dir1"

# pathB has only files (no sub-dirs) which contain new data:

pathB="dir2"

# We will create pathC to contain paths to sub-directories with
# files containing new data:

pathC="dir3"

# First, remove pathC and rsync pathA into it:

rm -rf "$pathC"
rsync -a "$pathA/" "$pathC/"

# Now, for each file in pathB:

for f in $(find "$pathB" -type f)
do

# ... find all the files matching that name in pathC
        readarray -t af < <(find "$pathC" -type f -name "$(basename "$f")")

# ... copy file f to each location l in pathC
        for l in "${af[@]}"
        do
                cp -vp "$f" "$l"
        done

done
EOF

변수를 편집 하고 경로와 함께 이전 데이터 파일의 위치로 test.sh설정합니다 . pathA변수를 pathB경로 없이 새 데이터 파일의 위치로 설정합니다. pathC생성하려는 새 경로로 변수를 설정합니다 . 이 디렉토리는 이미 존재해서는 안 됩니다. 실제로 스크립트가 실행될 때마다 삭제되고 다시 생성됩니다.

스크립트를 실행 가능하게 만듭니다.

$ chmod 755 test.sh

스크립트를 실행하면 dir3새 데이터 파일이 포함된 새 디렉터리가 생성되고 다음 구조와 일치하는 하위 디렉터리에 배치됩니다 dir1.

$ ./test.sh
dir2/file_7 -> dir3/C/file_7
dir2/file_7 -> dir3/D/file_7
dir2/file_4 -> dir3/B/file_4
dir2/file_4 -> dir3/D/file_4
dir2/file_9 -> dir3/C/file_9
dir2/file_9 -> dir3/D/file_9
dir2/file_3 -> dir3/A/file_3
dir2/file_3 -> dir3/D/file_3
dir2/file_1 -> dir3/A/file_1
dir2/file_1 -> dir3/D/file_1
dir2/file_6 -> dir3/B/file_6
dir2/file_6 -> dir3/D/file_6
dir2/file_2 -> dir3/A/file_2
dir2/file_2 -> dir3/D/file_2
dir2/file_8 -> dir3/C/file_8
dir2/file_8 -> dir3/D/file_8
dir2/file_5 -> dir3/B/file_5
dir2/file_5 -> dir3/D/file_5

완료되었을 때 모든 것이 좋아 보이면 이름을 dir2백업으로 바꾼 다음 다음 dir3으로 변경하십시오 dir2.

mv dir2 dir2.OLD && mv dir3 dir2

답변2

그리고 zsh:

#! /bin/zsh -
old_dir=${1?}
new_dir=${2?}

# build a filename -> subdir map
typeset -A map
for file ( $old_dir/*/**/*(N.) ) map[$file:t]=${${file#$old_dir/}:h}

# Process files in new dir:
for file ( $new_dir/*(N.) ) if (( $+map[$file:t] ))
  mkdir -p -- $newdir/$map[$file:t] && mv -- $file $newdir/$map[$file:t]/

관련 정보