将文件从多个文件夹移动到一个目标文件夹

时间:2012-07-18 12:51:14

标签: unix

亲爱的Unix用户我有6个文件夹,在每个文件夹中我有一个名为file.txt的文件。我拥有的所有文件夹中的文件名完全相同。我想将6个文件夹中每个文件夹中名为file.txt的所有文件移动到包含所有文件的常规文件夹中,因为我想最终连接文件。怎么做到这一点?

输入:
folder1:file.txt,folder2:file.txt,folder3:file.txt

输出: final_folder:file.txt,file.txt,file.txt

由于

爱莲

3 个答案:

答案 0 :(得分:2)

在同一目录中不能有多个具有相同名称的文件。如果您计划最终连接所有文件,而不是一次完成所有文件?

例如,以下命令将连接名称以file.txt开头的目录中的所有folder文件,并将输出写入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

答案 1 :(得分:2)

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

我会做一个找到然后一只猫进入文件

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

答案 2 :(得分:1)

这通过重命名为带有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