각 파일에 대한 디렉터리를 만들고 각 파일의 "n" 복사본을 만듭니다.

각 파일에 대한 디렉터리를 만들고 각 파일의 "n" 복사본을 만듭니다.

내 파일에 대한 솔루션을 찾다가 완벽한 것을 찾았고 여기에 답변을 제공합니다. 상위 디렉터리의 각 파일에 대한 디렉터리를 만드는 방법

하지만 이제 내 질문은 다음 명령줄을 사용하여 처리 중인 각 파일에 대해 생성된 디렉터리의 복사본을 50개 만드는 방법입니다.

ls -p | grep -v / | xargs -t -n1 -i bash -c 'for i in {1..50}; do cp {} "{}_folder/copy${i}_{}" ; done'

다음을 얻으십시오

-file1.csv---->folder_for_file1---->1copy_file1.csv,2copy_file1.csv,3copy_file1.csv........50copy_file1.csv
-file2.csv---->folder_for_file2---->1copy_file2.csv,2copy_file2.csv,3copy_file2.csv........50copy_file2.csv
-file3.csv---->folder_for_file3---->1copy_file3.csv,2copy_file3.csv,3copy_file3.csv........50copy_file3.csv
...
-file256.csv---->folder_forfile256---->1copy_file256.csv,2copy_file256.csv,3copy_file256.csv........50copy_file256.csv

이것을 이전 답변과 어떻게 일치시킬 수 있습니까? ? , 이 답변에 대한 함수 코드 포함

cd ParentFolder
for x in ./*.csv; do
  mkdir "${x%.*}" && mv "$x" "${x%.*}"

done

이 훌륭한 답변을 작성한 사람에게 모든 공로가 돌아가며 미리 감사드립니다.

답변1

$name{1..50}"$name"셸에서 50개의 문자열을 생성하는 데 사용할 수 있습니다. 각 문자열에는 1에서 50 사이의 숫자가 앞에 붙고 그 뒤에 문자열이 붙습니다 bash.

한 번에 모두 쓰려면 다음을 사용하십시오 tee.

tee {1..50}"$name" >/dev/null <somefile

... somefile파일 데이터가 50번 반복되어야 하는 경우입니다. 이 tee유틸리티는 표준 입력 스트림을 명령줄에 이름이 지정된 모든 파일과 표준 출력에 복사합니다(표준 출력 스트림을 로 리디렉션하는 이유 /dev/null).

디렉토리의 모든 일반 파일에 대한 디렉토리를 만듭니다 $topdir.

[ -n "$topdir" ] && cd -- "$topdir" || exit 1

for name in *; do
    if [ ! -f "$name" ] || [ -h "$name" ]; then
        # $name refers to non-regular file,
        # or to a symbolic link pointing to a regular file.
 
        continue
    fi

    mkdir -- "${name%.*}"
done

--명령줄 옵션의 끝을 나타내는 데 사용됩니다 . (또는 아래)와 함께 사용할 때 하나 이상의 옵션으로 잘못 해석될 수 있는 $name것처럼 대시로 시작할 수 있는지 여부를 (이 경우) 알 수 없을 때 사용하는 것이 편리합니다.-farse.txtmkdirteerm

mkdir파일 이름에 점이 포함되어 있지 않으면 스크립트가 기존 파일과 동일한 이름으로 디렉터리를 생성하려고 시도하므로 호출이 실패합니다 .

이 파일을 수정하여 새로 생성된 디렉터리에 50번 복사하고(해당 디렉터리가 생성된 경우) 원본 파일을 삭제합니다(원본 파일을 삭제할지 여부가 귀하의 질문에서 명확하지 않으므로 rm -f안전을 위해 Lose라고 언급했습니다). :

[ -n "$topdir" ] && cd -- "$topdir" || exit 1

for name in *; do
    if [ ! -f "$name" ] || [ -h "$name" ]; then
        # $name refers to non-regular file,
        # or to a symbolic link pointing to a regular file.
 
        continue
    fi

    destdir=${name%.*}

    if mkdir -- "$destdir" && tee -- "$destdir"/{1..50}"$name" >/dev/null <"$name"
    then
        printf 'Would remove "%s"\n' "$name"
        #rm -f -- "$name"
    fi
done

대신 tee간단한 루프를 사용하여 파일을 50번 복사합니다.

[ -n "$topdir" ] && cd -- "$topdir" || exit 1

for name in *; do
    if [ ! -f "$name" ] || [ -h "$name" ]; then
        # $name refers to non-regular file,
        # or to a symbolic link pointing to a regular file.
 
        continue
    fi

    destdir=${name%.*}

    mkdir -- "$destdir" || continue

    for newname in {1..50}"$name"; do
        cp -- "$name" "$destdir/$newname"
    done

    printf 'Would remove "%s"\n' "$name"
    #rm -f -- "$name"
done

rm -fcp루프가 성공하지 못 하더라도 (데이터 손실이 발생함) 마지막에 주석 처리를 해제하면 원본 파일이 삭제됩니다.

관련 정보