Bash는 각 x 파일에 대한 하위 폴더를 만들고 거기로 파일을 이동합니다.

Bash는 각 x 파일에 대한 하위 폴더를 만들고 거기로 파일을 이동합니다.

Python에서 코드를 실행하려고 하는데 하위 폴더에 100개의 파일이 있기 때문에 사용할 수 있는 대체 대시 명령을 찾고 있습니다. 파일을 10개의 폴더로 그룹화하려고 하는데 Python 스크립트가 필요하지 않습니다. 방해가 되려고 .

내가 시도하는 명령은 "<()"로 인해 대시에서 작동하지 않으며 대안을 찾고 있습니다.

암호:

i=0;while read l;do mkdir folder$i;mv $l folder$((i++));done< <(ls|xargs -n10)

실수:

Syntax error: redirection unexpected

답변1

이 코드는 bash에서는 작동하지만 POSIX 쉘에서는 작동하지 않습니다. 왜냐하면 <()명령 대체 형식은 이식 가능하지 않고 쉘이 Python 스크립트에서 호출될 때 /bin/sh실행되는 bash(예 dash: 많은 Debian 기반 시스템) 또는 bashPOSIX 모드가 아닌 것이 거의 확실하기 때문입니다. 또는 다른 기본 POSIX 쉘. 이는 다음과 같은 문제로 인해 매우 안전한 접근 방식은 아닙니다.질문구문 분석에 내재되어 있습니다 ls.

또 다른 접근 방식은 다음과 같습니다.

k=0 
for file in *; do 
    [ "$k" = 10 ] && k=0
    mkdir -p folder"$k"
    mv -- "$file" "folder$k"
    k=$((k+1))
done

mkdir -p모든 구현이 이 옵션을 지원하는 것은 아니므 로 이식성이 없다는 점에 유의하십시오 -p(디렉토리가 이미 존재한다고 불평하지 마십시오) mkdir. 이것이 문제인 경우 대상 디렉터리가 존재하는지 테스트하는 코드를 추가하거나 오류 메시지를 무시할 수 있습니다.

즉, Python 스크립트를 작성하는 경우 외부 셸을 호출하는 대신 Python에서 로컬로 이 모든 작업을 수행해야 합니다. Python에서 이 작업을 수행할 수 없는 이유는 없습니다. 다른 디렉터리에서 발생해야 한다고 언급했지만 전혀 문제가 되지 않습니다. Python 코드를 더 주의 깊게 살펴보고 Python에서 구현하는 것이 좋습니다.

예를 들어, 동일한 작업을 수행하는 Python 스크립트는 다음과 같습니다.

#!/usr/bin/env python3

import os
import shutil
import sys

# read the first argument into source_dir
source_dir = sys.argv[1]

dir_counter = 0
file_counter = 0

target_dir = os.path.join(source_dir, "folder")

for file_name in os.listdir(source_dir):
    # If this is a file
    if os.path.isfile(file_name):
        file_counter += 1
        # If this file number is a multiple of 10,
        # change the target dir name
        if file_counter % 10 == 0:
            dir_counter += 1
            target_dir = os.path.join(source_dir, "folder" + str(dir_counter))
        # Create the dir if it doesn't exist
        if not os.path.exists(target_dir):
            os.mkdir(target_dir)
        try:
            shutil.move(file_name, target_dir)
        except Exception as error_message:
            print("Failed to move %s to %s with error %s" %
                  (file_name, target_dir, error_message))

그런 다음 소스 디렉터리를 인수로 사용하여 스크립트를 실행합니다.

foo.py /path/to/source/directory

이것은 특별히 우아한 Python 스크립트는 아니며 상당히 개선될 수 있다고 확신하지만 앞으로 무슨 일이 일어날지에 대한 아이디어를 제공할 것입니다.

관련 정보