0

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

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

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

谢谢

埃莱奥诺拉

4

3 回答 3

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
于 2012-07-18T12:57:47.753 回答
2

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

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

 cat `find .name 'file' -print` path/newFile
于 2012-07-18T13:02:13.867 回答
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
于 2012-07-18T13:31:44.553 回答