Linux 将文件名列表从.txt传递给find and copy命令
我有一个包含xml文件名列表的.txt文件。 我需要将每个xml文件与目录中其他地方同名的图像配对 我已经使用sed从文件名中清除了.xmlLinux 将文件名列表从.txt传递给find and copy命令,linux,bash,find,sh,cp,Linux,Bash,Find,Sh,Cp,我有一个包含xml文件名列表的.txt文件。 我需要将每个xml文件与目录中其他地方同名的图像配对 我已经使用sed从文件名中清除了.xml Text File Example: DF_0001.jpg.xml DF_0002.jpg.xml After 'sed' cleaning: DF_0001.jpg DF_0002.jpg Source File and Path Example: path/to/drive/1/DF0001.jpg path/to/drive/2
Text File Example:
DF_0001.jpg.xml
DF_0002.jpg.xml
After 'sed' cleaning:
DF_0001.jpg
DF_0002.jpg
Source File and Path Example:
path/to/drive/1/DF0001.jpg
path/to/drive/2/DF0002.jpg
这里是包含xml文件列表的My.txt文件。这也是实际xml文件的位置:
/Sites/csv/file_list.txt
/Sites/csv/DF_0001.jpg.xml
/Sites/csv/DF_0002.jpg.xml
我的图像文件(同名)位于以下任意数量的目录中:
/Images/JPG/Day1/DF_0001.jpg
/Images/JPG/Day1/DF_0002.jpg
/Images/JPG/Day1/DF_0003.jpg
/Images/JPG/Day2/DF0004.jpg
/Images/JPG/Day2/DF0005.jpg
简言之:
我需要从txt文件中找到一个.jpg文件,并将相应的xml移到其中
sed 's/\.xml//' /Sites/csv/file_list.xml > /tmp/your_jpg_files.txt
find /Images/JPG -type f -name "*.jpg" | grep -F -f /tmp/your_jpg_files.txt |
while read FILEPATH; do
mv "/Sites/csv/${FILEPATH##*/}.xml" "${FILEPATH%/*}"
done
说明: 从文件_list.xml读取文件名,删除后缀.xml并将结果保存在临时文件中
列出目录/Images/jpg之后.jpg文件的所有路径
在路径列表中,可以查看jpg文件中的路径
在这一步中,您拥有指向.jpg文件的所有路径,对于其中任何一个,您都将生成所需的mv
${FILEPATH##*/}
=$(basename“$FILEPATH”)
但效率更高。${FILEPATH%/*}
=$(dirname“$FILEPATH”)
但效率更高
例子
FILEPATH
包含/Images/JPG/Day2/DF0005.JPG
,因此实际的mv
将是:
# /Sites/csv/${FILEPATH##*/}.xml -> /Sites/csv/DF0005.jpg.xml
# ${FILEPATH%/*} -> /Images/JPG/Day2/
mv "/Sites/csv/DF0005.jpg.xml" "/Images/JPG/Day2/"
下面是基于这样的假设,即文件名和路径名中都没有空格,并且xml文件名存储在名为
“xmls”
的文件中(在路径/文件名中处理空格可能很简单,但肯定很繁琐)
第一个命令查找当前目录和更深层目录中的所有JPEG,您可以轻松地进行更改,然后将路径名提供给一个管道,该管道将路径从文件名本身分割开来,第二个命令读取
“xmls”
文件以构建一个由JPEG名称索引的xml名称数组,然后处理另一个文件,如果存在匹配项,则打印shell命令。您是否可以对您的需求更具体一点?当然。。。我有一个文本文档中的xml文件列表。它们对应于我目录中其他位置的图像文件。我想一步一步地浏览文件列表,找到相应的图像,然后将xml移到同一个目录中..这个目录有一些问题-JPEG文件从未写入,因此awk无法引用。对此有何想法?在我的示例中,该文件是在命令行中的find
查找当前目录下的任何.jpg文件时编写的。如果.jpg文件不在当前目录下,则需要修改命令,用正确的起点替换“
”(从您的示例中可以是/Images
)。难以置信的工作@jaba10。坚持不懈和细心的帮助。没有你就做不到!!!
find /Images/JPG -type f -name "*.jpg"
grep --fixed-strings --file=/tmp/your_jpg_files.txt
while read FILEPATH; do
mv "/Sites/csv/${FILEPATH##*/}.xml" "${FILEPATH%/*}"
done
# /Sites/csv/${FILEPATH##*/}.xml -> /Sites/csv/DF0005.jpg.xml
# ${FILEPATH%/*} -> /Images/JPG/Day2/
mv "/Sites/csv/DF0005.jpg.xml" "/Images/JPG/Day2/"
find . -type f -name '*.jpg' | while read a ; do
printf '%s ' `dirname "$a"`
basename "$a"
done > jpegs
awk 'NR == FNR {tmp=$0;sub(".xml$","");xml[$0]=tmp;next}
{if(xml[$2]) {print "cp ", xml[$2], $1 }}' xmls jpegs