0

親愛なる Unix ユーザー 私は、たとえば 6 つのフォルダーを持っており、各フォルダーには file.txt というファイルがあります。ファイルの名前は、私が持っているすべてのフォルダーでまったく同じです。最終的にファイルを連結したいので、6つのフォルダーのそれぞれからfile.txtというファイルをすべて、すべてのファイルを含む一般的なフォルダーに移動したいと思います。これはどのように行うことができますか?

入力:
folder1: file.txt、folder2: file.txt、folder3: 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

1 つのディレクトリにすべて同じ名前を付けることはできません

私は検索を行い、次に猫をファイルに入れます

 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 に答える