【问题标题】:Move certain files from specific subdirectories into a new directory将特定子目录中的某些文件移动到新目录中
【发布时间】:2016-01-29 17:15:35
【问题描述】:

如何仅将特定子目录(不是所有子目录)中的某些文件(不是所有文件)移动到新目录中?

需要移动的文件已在 CSV 文件中列出,数量约为 85,000。他们已经提到了他们的绝对路径。所有文件都具有相同的扩展名,即.java。具体子目录的数量约为13000个。

是否有 Python 脚本(首选)或 Shell 脚本来执行此操作?

N.B:我搜索的论坛返回了有关如何将 所有 文件从 single 子目录中移动到新目录的解决方案。它们如下所述:

  1. https://www.daniweb.com/programming/software-development/threads/473187/copymove-all-sub-directories-from-a-folder-to-another-folder-using-python

  2. http://pythoncentral.io/how-to-copy-a-file-in-python-with-shutil/

  3. Filter directory when using shutil.copytree?

  4. https://unix.stackexchange.com/questions/207375/copy-certain-files-from-specified-subdirectories-into-a-separate-subdirectory

【问题讨论】:

  • 1) 创建这些特定目录的列表 2) 循环它们 3) 将这些特定文件(或只是 *.java)移动到您的目的地。
  • 您能否举例说明此 CSV 文件的外观?它是否包含您要移动的文件/目录的绝对路径以及它们需要移动的位置的绝对路径?
  • CSV 文件仅包含 1 列(无标题)。第一行:/home/shaw/Documents//Dataset/ANT/Repository/ChangedMethodFiles/bab9e2d799ee887bc0a404b4acdec0366234eafe/930587b01d54c1800f7cde3695b86d06 其余行是java。类似于这个,只有最后 2 个实体发生变化(即实际的 java 文件和包含它的文件夹)。它包含我要移动的文件/目录的绝对路径,但不是它们需要的绝对路径被移动。
  • 忽略'Documents'后面的双斜线,它实际上是一个单斜线。

标签: python shell csv


【解决方案1】:

假设您的 CSV 文件如下所示:

George,/home/geo/mtvernon.java,Betsy
Abe,/home/honest/gettys.java,Mary

你可以使用这个 shell 命令移动文件:

$ cut -d, -f2 < x.csv | xargs -I '{}'  mv '{}' /home/me/new-directory

【讨论】:

  • 我的 csv 文件 (/home/shaw/Desktop/SHAW_AntUnderstand.csv) 的第一 3 行如下所示:/home/shaw/Documents/Dataset/ANT/Repository/ChangedMethodFiles/bab9e2d799ee887bc0a404b4acdec036/7b01d54c1800f7cde3695606d .java
  • /home/shaw/Documents/Dataset/ANT/Repository/ChangedMethodFiles/20ab59bff57796a67e1cdfefbc29826e/f132a91640114b9d51804dd7.java
  • /home/shaw/Documents/Dataset/ANT/Repository/ChangedMethodFiles/8ce1de2178a0422105fa437c327bf3/b2933bb3d32ef7d12d5f40a.java
  • 我运行了以下命令:shaw@shaw-XPS-8700:~/Desktop$ cut -d, -f1
  • (我的 csv 文件只有 1 列,因此我使用了 -f1)
【解决方案2】:

这样的事情可能对你有用:

import os
import csv

def move_file(old_file_path, new_directory):
    if not os.path.isdir(new_directory):
        os.mkdir(new_directory)
    base_name = os.path.basename(old_file_path)
    new_file_path = os.path.join(new_directory, base_name)
    os.rename(old_file_path, new_file_path)

def parse_csv_file(csv_path):
    csv_file = open(csv_path)
    csv_reader = csv.reader(csv_file, delimiter=',', quotechar='"')
    paths = list(csv_reader)
    csv_file.close()
    return paths

if __name__ == '__main__':
    old_file_paths = parse_csv_file('your_csv_path')
    for old_file_path in old_file_paths:
        move_file(old_file_path, 'your_new_directory')

这假定您的 CSV 文件仅包含由逗号分隔的路径,并且所有这些文件都存在。

【讨论】:

  • 当我尝试运行它时,“CSV 文件中提到的文件”和“旧路径中提到的所有文件”之间的比较没有发生。即(整个旧文件夹已移至新目录;不仅仅是旧文件夹中的特定文件)。我错过了什么吗?
  • 尝试只运行第一行并查看len(old_file_paths) 是否产生合理的值。
猜你喜欢
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多