Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将文件名列表从.txt传递给find and copy命令_Linux_Bash_Find_Sh_Cp - Fatal编程技术网

Linux 将文件名列表从.txt传递给find and copy命令

Linux 将文件名列表从.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

我有一个包含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/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