【问题标题】:move files from multiple folder to one destination folder将文件从多个文件夹移动到一个目标文件夹
【发布时间】:2012-07-18 12:51:14
【问题描述】:

亲爱的 Unix 用户,例如,我有 6 个文件夹,每个文件夹中都有一个名为 file.txt 的文件。我拥有的所有文件夹中的文件名完全相同。我想将所有名为 file.txt 的文件从 6 个文件夹中的每一个移动到一个包含所有文件的通用文件夹中,因为我想最终连接这些文件。如何做到这一点?

输入:
文件夹1:file.txt,文件夹2:file.txt,文件夹3:file.txt

输出: final_folder:file.txt、file.txt、file.txt

谢谢

埃莉奥诺拉

【问题讨论】:

  • 我认为这是不可能的。您的目标文件夹中有同名文件,它们将被覆盖。您可以使用 unix 工具 find,找到所有名称为 file.txt 的文件,并将它们与 mv 一起移动到您的目标文件夹。但是您必须重命名文件。例如到file1.txt、file2.txt…

标签: unix


【解决方案1】:

同一目录中不能有多个同名文件。如果您打算最终连接所有文件,而不是一次完成所有文件?

例如,以下命令将连接目录中名称以folder 开头的所有file.txt 文件,并将输出写入new_file.txt

cat folder*/file.txt > new_file.txt

如果您想在多级子目录中包含文件,可以考虑使用find。 下面将递归搜索当前目录(以及所有子目录)中的file.txt,并将其内容连接到new_file.txt

find . -name file.txt -exec cat {} \; > new_file.txt

【讨论】:

  • 嗨,肖恩!确切地!我想将它们连接在一起。我知道没有同名文件可以保留在同一个文件夹中,但它们是在每个文件夹中独立运行的算法的输出。我尝试了您建议我的代码,但它不起作用。它仅复制最终 new_file.txt 中 file.txt 的内容。
  • 这只是一个例子;您需要修改它以适合您的文件结构。如果您发布更具体的示例,我们可能会提供帮助。
  • 是的,肖恩,我正在解决的问题在我发布的问题中已在上面进行了准确解释。我试图写一个循环如下: for i in folder*;执行 cat file.txt > new_file.txt $i;完毕。它也不起作用..
  • 你的循环应该是这样的:for i in folder*; do cat $i/file.txt >> new_file.txt; done。但是,我提供的示例没有理由不能正常工作。
  • 嗨,肖恩!现在幸运的是它工作正常。我只是想让你问最后一个快速的问题。我要连接的每个文件在开头都包含 17 行,我想在连接之前删除,因为它们包含我在运行软件之前设置的参数。是否有一个参数(如 head -n)能够在 cat 中为我执行此操作?非常感谢!
【解决方案2】:

它们不能在一个目录中都具有相同的名称

我会先查找,然后将猫放入文件中

 cat `find .name 'file' -print` path/newFile

【讨论】:

    【解决方案3】:

    这通过重命名为带有 inodenumber 前缀的名称来处理重复名称的冲突。该函数不是严格需要的。

    对于带有空格或制表符的文件名,这种方法可能会失败,或者更糟。 (但是在名字中加入空格和制表符的人应该失去......)

    #!/bin/sh
    
    DIRS="dir1 dir2 dir3 dir4"
    TARGET=$HOME/txt
    
    move_one()
    {
      p=$1         # Full pathname
      t=$2         # Target directory
      i=$3         # Inode number from sourcefile
      d=`dirname $p`
      b=`basename $p`
      #echo "p=$p"
      #echo "d=$d" # the path-prefix from the source file
      #echo "b=$b" # The name part of the source file
      #echo "t=$t"
      #echo "i=$i"
    # After checking, remove the echo below for more fun
      echo mv -i $p $t/$i$b
    }
                                            # inodenumber+name
    find $DIRS -name \*txt -type f -ls | awk '{print $1," ",$11}' | (
            while read i p; do
            # echo "i=$i"
            # echo "p=$p"
            move_one $p $TARGET $i
            done
            )
    #eof
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2022-10-25
      • 2021-03-21
      相关资源
      最近更新 更多