Сreating Bash array - arrays

Create array: array=($(ls -l))
Show full an array: echo ${array[#]}
Result: total 0 -rw-r--r-- 1 root root 0 Jul 14 05:54 1 -rw-r--r-- 1 root root 0 Jul 14 05:54 2 -rw-r--r-- 1 root root 0 Jul 14 05:54 3 -rw-r--r-- 1 root root 0 Jul 14 05:54 4 -rw-r--r-- 1 root root 0 Jul 14 05:54 5
Show part of an array: echo ${array[#]:0:11}
Result: total 0 -rw-r--r-- 1 root root 0 Jul 14 05:54 1
Show other part of an array: echo ${array[#]:11:20}
Result: -rw-r--r-- 1 root root 0 Jul 14 05:54 2 -rw-r--r-- 1 root root 0 Jul 14 05:54 3 -rw-r--r-- 1
Why not only elements 11-20 are shown, but also the rest?

Related

How to change from NTFS to "noramal FS" in USB memory?

Several years ago, I change my usb file system(FS) from default FS to NTFS. but now, I want to change to default FS.
What is the way to change that FS?
Machine Enviroment: macOSX 10.14
default Format: MS-DOS(FAT32)
current Format: Windows NT FileSystem(NTFS)
USB internal file by terminal
>>ls -l -FG -a
total 6403240
-rwxr-xr-x# 1 takezakiyuuta staff 2352 8 2 2018 $UGM*
drwxr-xr-x 1 takezakiyuuta staff 8192 8 23 2018 ./
drwxr-xr-x+ 10 root wheel 320 2 21 19:39 ../
-rwxr-xr-x 1 takezakiyuuta staff 12 8 9 2018 .avm_speed_test2*
drwxr-xr-x 1 takezakiyuuta staff 0 8 10 2018 .fseventsd/
-rwxr-xr-x 1 takezakiyuuta staff 11 8 23 2018 .hd_keepalive*
drwxr-xr-x 1 takezakiyuuta staff 16384 8 23 2018 .index/
drwxr-xr-x 1 takezakiyuuta staff 16384 8 23 2018 .thumb/
-rwxr-xr-x 1 takezakiyuuta staff 354368793 8 18 2018 180818-1039.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 156281700 8 18 2018 180818-1042.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 232452505 8 18 2018 180818-1044.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 164182010 8 20 2018 180820-1817.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 470749844 8 20 2018 180820-1820.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 299472449 8 20 2018 180820-1824.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 112263523 8 23 2018 180823-2044.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 56539836 8 23 2018 180823-2046.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 42780723 8 23 2018 180823-2048.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 290799372 8 23 2018 180823-2050.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 365304821 8 23 2018 180823-2052.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 396741824 8 23 2018 180823-2055.mp4*
-rwxr-xr-x 1 takezakiyuuta staff 336483041 8 23 2018 180823-2058.mp4*
drwxr-xr-x# 1 takezakiyuuta staff 0 8 2 2018 System Volume Information/

How do I figure out which i2c device is which programmatically?

I have 11 i2c device nodes on my system.
localhost user # ls /dev/i2c*
/dev/i2c-0 /dev/i2c-1 /dev/i2c-10 /dev/i2c-2 /dev/i2c-3 /dev/i2c-4 /dev/i2c-5 /dev/i2c-6 /dev/i2c-7 /dev/i2c-8 /dev/i2c-9
I can figure out which one is which by poking around in the /sys filesystem:
localhost devices # pwd
/sys/bus/i2c/devices
localhost devices # ls -al
total 0
drwxr-xr-x 2 root root 0 Jan 10 15:45 .
drwxr-xr-x 4 root root 0 Jan 10 15:45 ..
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-0 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-0
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-1 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-1
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-10 -> ../../../devices/pci0000:00/0000:00:19.2/i2c_designware.5/i2c-10
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-10508825:00 -> ../../../devices/pci0000:00/0000:00:19.2/i2c_designware.5/i2c-10/i2c-10508825:00
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-2 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-2
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-3 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-3
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-4 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-4
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-5 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-5
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-6 -> ../../../devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-6
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-7 -> ../../../devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-7
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-8 -> ../../../devices/pci0000:00/0000:00:15.2/i2c_designware.2/i2c-8
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-9 -> ../../../devices/pci0000:00/0000:00:15.3/i2c_designware.3/i2c-9
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-INT343B:00 -> ../../../devices/pci0000:00/0000:00:19.2/i2c_designware.5/i2c-10/i2c-INT343B:00
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-INT343B:01 -> ../../../devices/pci0000:00/0000:00:19.2/i2c_designware.5/i2c-10/i2c-INT343B:01
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-PRP0001:00 -> ../../../devices/pci0000:00/0000:00:15.2/i2c_designware.2/i2c-8/i2c-PRP0001:00
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-PRP0001:01 -> ../../../devices/pci0000:00/0000:00:15.3/i2c_designware.3/i2c-9/i2c-PRP0001:01
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-SYNA7817:00 -> ../../../devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-6/i2c-SYNA7817:00
lrwxrwxrwx 1 root root 0 Jan 10 15:45 i2c-SYNA7817:01 -> ../../../devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-7/i2c-SYNA7817:01
The ones that I want are i2c-PRP0001-*, which I can see are currently symlinked to i2c-8 and i2c-9.
i2c offers no guarantee that these node numbers are stable (even across reboots). I would like to give my program the ability to look at an i2c device and determine if it's one I care about or not.
I could hack up a shell script to do basically what I just did on the command line, but is there a programmatic (C) way to find the device information (i.e. where does the kernel get the information that it writes to the sys filesystem)?

/usr/bin/ld: cannot find -lruby

I hope build ruby c extension with cmake, but I get /usr/bin/ld: cannot find -llibruby in console, here is my code:
CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
file(GLOB cs *.c)
include_directories($ENV{HOME}/.rbenv/versions/2.2.3/include/ruby-2.2.0/x86_64-linux
$ENV{HOME}/.rbenv/versions/2.2.3/include/ruby-2.2.0)
foreach (c ${cs})
get_filename_component(exe ${c} NAME_WE)
add_executable(${exe} ${cs})
endforeach ()
add_library(mytest SHARED MyTest.c)
link_directories($ENV{HOME}/.rbenv/versions/2.2.3/lib)
find_library(ruby NAMES ruby)
target_link_libraries(mytest ruby)
and here is ruby lib:
roroco#roroco-Zhaoyang-K49 ~/Dropbox/rbs/ro_plans $ lsa ~/.rbenv/versions/2.2.3/lib
total 61424
drwxr-xr-x 4 roroco roroco 4096 Nov 21 23:49 .
drwxr-xr-x 6 roroco roroco 4096 Oct 13 22:10 ..
lrwxrwxrwx 1 roroco roroco 16 Nov 21 23:49 libruby.so -> libruby.so.2.2.0
lrwxrwxrwx 1 roroco roroco 16 Nov 21 23:49 libruby.so.2.2 -> libruby.so.2.2.0
-rwxr-xr-x 1 roroco roroco 13573794 Nov 21 23:49 libruby.so.2.2.0
-rw-r--r-- 1 roroco roroco 49306632 Nov 21 23:47 libruby-static.a
drwxr-xr-x 2 roroco roroco 4096 Nov 21 23:49 pkgconfig
drwxr-xr-x 6 roroco roroco 4096 Oct 13 22:10 ruby

centos delete files in n days ago

My server is Centos 7.
My files structure is:
-rw-r--r-- 1 root root 13968 مه 31 15:53 Data---2015-05-31---13:23:01.tar.gz
-rw-r--r-- 1 root root 16037 مه 31 16:30 Data---2015-05-31---14:00:01.tar.gz
-rw-r--r-- 1 root root 20379 مه 31 18:30 Data---2015-05-31---16:00:01.tar.gz
-rw-r--r-- 1 root root 20379 مه 31 22:30 Data---2015-05-31---20:00:01.tar.gz
-rw-r--r-- 1 root root 21892 ژوئن 1 10:30 Data---2015-06-01---08:00:01.tar.gz
-rw-r--r-- 1 root root 25734 ژوئن 1 12:30 Data---2015-06-01---10:00:01.tar.gz
-rw-r--r-- 1 root root 27880 ژوئن 1 14:30 Data---2015-06-01---14:30:01.tar.gz
-rw-r--r-- 1 root root 33161 ژوئن 1 16:30 Data---2015-06-01---16:30:01.tar.gz
-rw-r--r-- 1 root root 33179 ژوئن 1 18:30 Data---2015-06-01---18:30:01.tar.gz
-rw-r--r-- 1 root root 35082 ژوئن 1 22:30 Data---2015-06-01---22:30:01.tar.gz
-rw-r--r-- 1 root root 54499 ژوئن 2 10:30 Data---2015-06-02---10:30:01.tar.gz
-rw-r--r-- 1 root root 57289 ژوئن 2 12:30 Data---2015-06-02---12:30:01.tar.gz
-rw-r--r-- 1 root root 61077 ژوئن 2 14:30 Data---2015-06-02---14:30:01.tar.gz
-rw-r--r-- 1 root root 63617 ژوئن 2 16:30 Data---2015-06-02---16:30:01.tar.gz
-rw-r--r-- 1 root root 63619 ژوئن 2 18:30 Data---2015-06-02---18:30:01.tar.gz
-rw-r--r-- 1 root root 63722 ژوئن 2 22:30 Data---2015-06-02---22:30:01.tar.gz
-rw-r--r-- 1 root root 63722 ژوئن 3 10:30 Data---2015-06-03---10:30:01.tar.gz
-rw-r--r-- 1 root root 63722 ژوئن 3 12:30 Data---2015-06-03---12:30:01.tar.gz
-rw-r--r-- 1 root root 63723 ژوئن 3 14:30 Data---2015-06-03---14:30:01.tar.gz
-rw-r--r-- 1 root root 63723 ژوئن 3 16:30 Data---2015-06-03---16:30:01.tar.gz
-rw-r--r-- 1 root root 63722 ژوئن 3 18:30 Data---2015-06-03---18:30:01.tar.gz
-rw-r--r-- 1 root root 63723 ژوئن 3 22:30 Data---2015-06-03---22:30:01.tar.gz
How can I delete files n days ago?
I use this commands and am not getting the correct result:
find CodeBackup/* -type f -mtime +1 -exec rm '{}' '+';
Delete files greater 1 day old:
find CodeBackup -type f -mtime +1 -exec rm -f {} \;

How to map /proc/bus/usb/devices entry to a /dev/sdX device?

I need to know how I can figure out to which entry in /proc/bus/usb/devices a /dev/sdX device maps to. Basically, I need to know the vendor id and product id of a given USB stick (which may not have a serial number).
In my case, I have this entry for my flash drive in /proc/bus/usb/devices:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0781 ProdID=5530 Rev= 2.00
S: Manufacturer=SanDisk
S: Product=Cruzer
S: SerialNumber=0765400A1BD05BEE
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I happen to know that in my case it is /dev/sda, but I'm not sure how I can figure this out in code. My first approach was to loop through all /dev/sdXX devices and issue a SCSI_IOCTL_GET_BUS_NUMBER and/or SCSI_IOCTL_GET_IDLUN request, but the information returned doesn't help me match it up:
/tmp # ./getscsiinfo /dev/sda
SCSI bus number: 8
ID: 00
LUN: 00
Channel: 00
Host#: 08
four_in_one: 08000000
host_unique_id: 0
I'm not sure how I can use the SCSI bus number or the ID, LUN, Channel, Host to map it to the entry in /proc/bus/usb/devices. Or how I could get the SCSI bus number from the /proc/bus/usb/001/006 device, which is a usbfs device and doesn't appear to like the same ioctl's:
/tmp # ./getscsiinfo /proc/bus/usb/001/006
Could not get bus number: Inappropriate ioctl for device
Here's the test code for my little getscsiinfo test tool:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <scsi/scsi.h>
#include <scsi/sg.h>
#include <sys/ioctl.h>
struct scsi_idlun
{
int four_in_one;
int host_unique_id;
};
int main(int argc, char** argv) {
if (argc != 2)
return 1;
int fd = open(argv[1], O_RDONLY | O_NONBLOCK);
if (fd < 0)
{
printf("Error opening device: %m\n");
return 1;
}
int busNumber = -1;
if (ioctl(fd, SCSI_IOCTL_GET_BUS_NUMBER, &busNumber) < 0)
{
printf("Could not get bus number: %m\n");
close(fd);
return 1;
}
printf("SCSI bus number: %d\n", busNumber);
struct scsi_idlun argid;
if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, &argid) < 0)
{
printf("Could not get id: %m\n");
close(fd);
return 1;
}
printf("ID: %02x\n", argid.four_in_one & 0xFF);
printf("LUN: %02x\n", (argid.four_in_one >> 8) & 0xFF);
printf("Channel: %02x\n", (argid.four_in_one >> 16) & 0xFF);
printf("Host#: %02x\n", (argid.four_in_one >> 24) & 0xFF);
printf("four_in_one: %08x\n", (unsigned int)argid.four_in_one);
printf("host_unique_id: %d\n", argid.host_unique_id);
close(fd);
return 0;
}
Does anyone have any idea?
udevadm is capable of what your are trying to achieve.
udevadm info -a -p $(udevadm info -q path -n /dev/sda)
udevadm's sources will tell you how it is done.
I believe you can collect such information using libudev library.
Here are some details about it: http://www.signal11.us/oss/udev/
I found something like this on above site:
.. Using libudev, we'll be able to inspect the devices, including their Vendor ID (VID), Product ID (PID), serial number, and device strings, without ever opening the device. Further, libudev will tell us exactly where inside /dev the device's node is located, giving the application a robust and distribution-independent way of accessing the device. ...
This isn't all that easy, nor very well documented (at least from a high-level perspective). The following should work in Kernel's from version 3.1 upward (at least).
I have found the easiest (probably not the only way) is to navigate from the block device entry and test each block device until you find the one that matches your USB entry.
For example, given a block device in /sys/block, such as sdb, you can find the hardware device descriptor entry like this:
# cd /sys/block
# cd $(readlink sdb); cd ../../../../../..
# ls -l
total 0
drwxr-xr-x 6 root root 0 Aug 14 10:47 1-1:1.0
-rw-r--r-- 1 root root 4096 Aug 14 10:52 authorized
-rw-r--r-- 1 root root 4096 Aug 14 10:52 avoid_reset_quirk
-r--r--r-- 1 root root 4096 Aug 14 10:47 bcdDevice
-rw-r--r-- 1 root root 4096 Aug 14 10:49 bConfigurationValue
-r--r--r-- 1 root root 4096 Aug 14 10:47 bDeviceClass
-r--r--r-- 1 root root 4096 Aug 14 10:49 bDeviceProtocol
-r--r--r-- 1 root root 4096 Aug 14 10:49 bDeviceSubClass
-r--r--r-- 1 root root 4096 Aug 14 10:49 bmAttributes
-r--r--r-- 1 root root 4096 Aug 14 10:49 bMaxPacketSize0
-r--r--r-- 1 root root 4096 Aug 14 10:49 bMaxPower
-r--r--r-- 1 root root 4096 Aug 14 10:49 bNumConfigurations
-r--r--r-- 1 root root 4096 Aug 14 10:49 bNumInterfaces
-r--r--r-- 1 root root 4096 Aug 14 10:49 busnum
-r--r--r-- 1 root root 4096 Aug 14 10:52 configuration
-r--r--r-- 1 root root 65553 Aug 14 10:47 descriptors
-r--r--r-- 1 root root 4096 Aug 14 10:52 dev
-r--r--r-- 1 root root 4096 Aug 14 10:49 devnum
-r--r--r-- 1 root root 4096 Aug 14 10:52 devpath
lrwxrwxrwx 1 root root 0 Aug 14 10:47 driver -> ../../../../../../bus/usb/drivers/usb
drwxr-xr-x 3 root root 0 Aug 14 10:52 ep_00
-r--r--r-- 1 root root 4096 Aug 14 10:47 idProduct
-r--r--r-- 1 root root 4096 Aug 14 10:47 idVendor
-r--r--r-- 1 root root 4096 Aug 14 10:52 ltm_capable
-r--r--r-- 1 root root 4096 Aug 14 10:47 manufacturer
-r--r--r-- 1 root root 4096 Aug 14 10:49 maxchild
lrwxrwxrwx 1 root root 0 Aug 14 10:52 port -> ../1-0:1.0/port1
drwxr-xr-x 2 root root 0 Aug 14 10:52 power
-r--r--r-- 1 root root 4096 Aug 14 10:47 product
-r--r--r-- 1 root root 4096 Aug 14 10:52 quirks
-r--r--r-- 1 root root 4096 Aug 14 10:47 removable
--w------- 1 root root 4096 Aug 14 10:52 remove
-r--r--r-- 1 root root 4096 Aug 14 10:47 serial
-r--r--r-- 1 root root 4096 Aug 14 10:49 speed
lrwxrwxrwx 1 root root 0 Aug 14 10:47 subsystem -> ../../../../../../bus/usb
-rw-r--r-- 1 root root 4096 Aug 14 10:47 uevent
-r--r--r-- 1 root root 4096 Aug 14 10:52 urbnum
-r--r--r-- 1 root root 4096 Aug 14 10:49 version
(You can find excellent documentation for the contents of the USB Descriptor here on the BeyondLogic site.)
Given the above, you should be able to map one or more of the USB device fields to the contents of /proc/bus/usb/devices. I find that the serial number is the easiest to match on, so that if you were to cat serial above, you would get the same serial number as listed:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0781 ProdID=5575 Rev=01.26
S: Manufacturer=SanDisk
S: Product=Cruzer Glide
S: SerialNumber=4C530100801115115112
C: #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
If you go to /sys/block, you can list the full path to the host device entry in the storage driver sysfs entry for each device. Typically, I do this using some programmatic means instead of at the shell prompt, but here you can see the links themselves:
# ls -l sd*
lrwxrwxrwx 1 root root 0 Aug 14 10:45 sda -> ../devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Aug 14 10:47 sdb -> ../devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host33/target33:0:0/33:0:0:0/block/sdb
Note that you mustn't make any assumptions about the numbers you see in the links. Depending upon the bus subsystem, the mappings could be quite different. For example, on a Raspberry Pi, it looks like this:
# ls -l sd*
lrwxrwxrwx 1 root root 0 Aug 13 23:54 sda -> ../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0/host3/target3:0:0/3:0:0:0/block/sda
lrwxrwxrwx 1 root root 0 Aug 13 23:54 sdb -> ../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/host4/target4:0:0/4:0:0:0/block/sdb
So, the best approach is to take the approach listed at the top and navigate relative to the storage driver to find the USB device descriptor.
I'd be curious about more authoritative answers to this. The method above was arrived at by trial-and-error but has been working on several different devices and Kernels with no problem.
Instead of using proc/bus/usb which is for usbfs you can use /proc/scsi/scsi. In there you can find the Vendor and Serial number with specific channel ID and LUN number.

Resources