亲爱的Unix用户我有6个文件夹,在每个文件夹中我有一个名为file.txt的文件。我拥有的所有文件夹中的文件名完全相同。我想将6个文件夹中每个文件夹中名为file.txt的所有文件移动到包含所有文件的常规文件夹中,因为我想最终连接文件。怎么做到这一点?
输入:
folder1:file.txt,folder2:file.txt,folder3:file.txt
输出: final_folder:file.txt,file.txt,file.txt
由于
爱莲
答案 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